リストの = 演算子の予期しない動作
次のコードに示すように、Python の = 演算子はリストを操作するときに予期しない動作を示します。スニペット:
class foo: bar = [] def __init__(self, x): self.bar += [x] class foo2: bar = [] def __init__(self, x): self.bar = self.bar + [x] f = foo(1) g = foo(2) print(f.bar) print(g.bar)
出力:
[1, 2] [1, 2]
= 演算子はクラスのすべてのインスタンスに影響を与えるようですが、foo = foo bar は期待どおりに動作します。
この動作は、= 演算子の基礎となる実装に起因します。まず、iadd 特別メソッドの呼び出しを試みます。このメソッドはインプレース追加を目的としており、作用するオブジェクトを変更します。 iadd が使用できない場合は、add 特殊メソッドに戻り、新しいオブジェクトを返します。
リストの場合は、add が定義されており、新しいリストが返されます。したがって、リストで = を使用すると、既存のリストを変更するのではなく、新しいリストが作成されます。これは、上記の例で f と g が同じバー リストを共有する理由を説明しています。
= 演算子は、変更可能なオブジェクトに対して異なる動作をし、iadd メソッドを通じてその場でオブジェクトを変更します。文字列や整数などの不変オブジェクトの場合は、add のみが使用可能であり、新しいオブジェクトが作成されます。
要約すると、
以上がPython の = リスト上の演算子が予期しない共有状態の動作を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。