web-dev-qa-db-ja.com

セット内のunion()とunion_update()の違い、およびその他?

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)を意味しますか?それらは現在同じオブジェクトを参照していますか?

つまり、両方のメソッドセットが実装されている理由がよくわかりません。重要な機能は追加されていないようです。

17

それらは非常に異なります。一方のセットはセットを変更しますインプレース、もう一方のセットは元のセットをそのままにして、代わりにコピーを返します。

_>>> 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です(エコーされることはありません)。

31
Martijn Pieters

__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_メソッドによって追加された機能は、既存のセットを変更する機能です。複数のオブジェクト間でセットを共有する場合は、既存のセットを変更して、それを共有する他のオブジェクトが変更を確認できるようにすることができます。新しいセットを作成するだけでは、他のオブジェクトはそれを認識しません。

2
BrenBarn

ドキュメントには可能な限り明確な方法で記載されていないようですが、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]: 

編集:実際には、 ドキュメント 質問に何を表示するかは言わないでください。彼らが言う:

セットを更新し、他のすべての要素を追加します。

そして

セットを更新し、セット内で見つかった要素と他のすべての要素のみを保持します。

1
Lev Levitsky