2016-04-16 14 views
5

なぜこの設定操作が変更されますかsPythonの "&=" set演算子が "&="整数演算と異なる動作をするのはなぜですか?

s = set('abc') 
t = set('bcd') 
u=s 
print u, s, t 
u &= t 
print u, s, t 

結果:

set(['a', 'c', 'b']) set(['a', 'c', 'b']) set(['c', 'b', 'd']) 

set(['c', 'b']) set(['c', 'b']) set(['c', 'b', 'd']) 

それは....

Set操作&=を(sを変更)同じ演算子の整数(ビット単位)バージョンと同じように動作しません。ビット操作&=sを変更しない):

s = 7 
t = 3 
u=s 
print u, s, t 
u &= t 
print u, s, t 

結果:

7 7 3 

3 7 3 
+7

セットは変更可能であり、整数は変更できません。 'frozenset'で試してみてください。 – jonrsharpe

+0

それはfrozensetsと期待どおりに動作します。したがって、操作では、セットu(文の先頭にあるsと同じオブジェクト)をインプレースで変更しようとしていないか、例外が発生しています。それは何をしようとしていますか? –

+0

リストは、&=のセットと同じ動作を示します。タプルは型エラーを引き起こします。 –

答えて

5

整数は(それがすることはないだろうあなたがx &= yを使用するときに、単純ではなく、内部状態を変更するよりも、変数xを再割り当てしたx = x & yに展開され、&操作ではなく、&=動作を実現+のように意味をなさないように、&が値を変更するのは非常に意味があります)。 frozensetsと同じです。

セットは&=オペレーションを実装しているため、変数の再割り当てには拡張されず、オペレータの左側が変更されます。

タプルは&&=も実装していないため、エラーには意味があります。しかし、+=で同じ効果が得られます。タプル+=が展開されているため、リストは変更可能であるため、インプレース変異です。

いずれのクラスも、これらの演算子の独自のバージョンを実装できます。詳細は、hereを参照してください。特に&は、__and__および&=~__iand__に対応する。

考えてみると、変更可能なクラスでは、インプレース演算子を実装して、直接変更できるようにするのが理にかなっていますが、変更できないクラスはありません。

+0

ありがとうございます。あなたは私に "Augmented Assignment"、PEP-203、そして私の答えを見つけるのに十分な情報をhttps://docs.python.org/2/reference/simple_stmts.htmlのPython 2.7.11文書に与えました。 –

関連する問題