27

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

両方のメソッドセットが実装されているのはなぜですか?重要な機能は追加されていないようです。

4

3 に答える 3

46

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

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

于 2012-12-16T21:29:37.107 に答える
2

_updateメソッドはセットをインプレースで変更し、Noneを返します。update新しいオブジェクトを返さないメソッド。それはNonex = s.update(t)に設定されるので、あなたはほぼ間違いなくやりたくないでしょう。x

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

于 2012-12-16T21:30:52.213 に答える
1

ドキュメントには可能な限り明確な方法で記載されていないようですが、何も返さset.updateれません(これは、返されるのと同じです)。また、返されません。またはのように、それらは所定の場所でコンテナを変更します。Noneset.intersection_updatelist.appendlist.extenddict.update

In [1]: set('abba')
Out[1]: set(['a', 'b'])

In [2]: set('abba').update(set('c'))

In [3]: 

編集:実際には、ドキュメントには質問に何を表示するかは記載されていません。彼らが言うには:

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

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

于 2012-12-16T21:33:02.840 に答える