Pythonセットには次のメソッドがあります。
_s.union(t) s | t new set with elements from both s and t
s.update(t) s |= t return set s with elements added from t
_
同様に、これらもあります:
_s.intersection_update(t) s &= t return set s keeping only elements also found in t
s.intersection(t) s & t new set with elements common to s and t
_
など、すべての標準的な関係代数演算について。
だから...質問は、ここでの違いは正確には何ですか? update()バージョンが新しいセットではなくsを返すと表示されているのがわかりますが、x = s.update(t)
と書くと、それはid(x) == id(s)
を意味しますか?それらは現在同じオブジェクトを参照していますか?
つまり、両方のメソッドセットが実装されている理由がよくわかりません。重要な機能は追加されていないようです。
それらは非常に異なります。一方のセットはセットを変更しますインプレース、もう一方のセットは元のセットをそのままにして、代わりにコピーを返します。
_>>> s = {1, 2, 3}
>>> news = s | {4}
>>> s
set([1, 2, 3])
>>> news
set([1, 2, 3, 4])
_
s
が変更されていないことに注意してください。
_>>> s.update({4})
>>> s
set([1, 2, 3, 4])
_
今、私はs
自体を変更しました。 .update()
は何も返さないように見えることにも注意してください。呼び出し元にs
を返さず、Pythonインタープリターは値をエコーしませんでした。
オブジェクトをインプレースで変更するメソッドは、Pythonで元のオブジェクトを返すことはありません。代わりに、戻り値は常にNone
です(エコーされることはありません)。
__update
_メソッドは、セットをインプレースで変更し、Noneを返します。 update
のないメソッドは、新しいオブジェクトを返します。 x
がNoneに設定されるため、ほぼ確実にx = s.update(t)
を実行したくないでしょう。
_>>> x = set([1, 2])
>>> x.intersection(set([2, 3]))
set([2])
>>> x
set([1, 2])
>>> x.intersection_update(set([2, 3]))
>>> x
set([2])
>>> x = x.intersection_update(set([2, 3]))
>>> print x
None
_
__update
_メソッドによって追加された機能は、既存のセットを変更する機能です。複数のオブジェクト間でセットを共有する場合は、既存のセットを変更して、それを共有する他のオブジェクトが変更を確認できるようにすることができます。新しいセットを作成するだけでは、他のオブジェクトはそれを認識しません。
ドキュメントには可能な限り明確な方法で記載されていないようですが、set.update
は何もreturnしません(これはNone
)を返すのと同じですが、set.intersection_update
も返しません。 list.append
またはlist.extend
またはdict.update
のように、それらは所定の場所でコンテナを変更します。
In [1]: set('abba')
Out[1]: set(['a', 'b'])
In [2]: set('abba').update(set('c'))
In [3]:
編集:実際には、 ドキュメント 質問に何を表示するかは言わないでください。彼らが言う:
セットを更新し、他のすべての要素を追加します。
そして
セットを更新し、セット内で見つかった要素と他のすべての要素のみを保持します。