2

フローズンセットで拡張代入を試したところ、驚くべき結果が得られました。

>>> x = frozenset(['foo', 'bar', 'baz'])
>>> x
frozenset({'foo', 'baz', 'bar'})
>>> x &= {'baz', 'qux', 'quux'}
>>> x
frozenset({'baz'})

こんなはずじゃないですよね?凍結セットは不変ではありませんか?

4

2 に答える 2

2

割り当てが元のfrozensetを変更していないことを除いて、Frozensetx不変です-変数を二項演算子の結果に再割り当てしているだけ&です。コメントで user2357112 が指摘したように、メソッドが見つからなかった後にx &= {'baz', 'qux', 'quux'}フォールバックし、変更のない操作を残します。x = x & {'baz', 'qux', 'quux'}__iand__

__iand__この動作は、を提供しない不変型に対する他の拡張操作で見られます。

In[1]: x = (1, 2, 3)
In[2]: id(x)
Out[2]: 761782862328
In[3]: x += (4, 5)
In[4]: id(x)   # we now have a different id
Out[4]: 761780182888
In[5]: x[2] = 3  # an actual mutating operation
TypeError: 'tuple' object does not support item assignment
于 2017-02-05T03:19:05.900 に答える