ホームページ >バックエンド開発 >Python チュートリアル >Python の = リスト上の演算子が予期しない共有状態の動作を引き起こすのはなぜですか?

Python の = リスト上の演算子が予期しない共有状態の動作を引き起こすのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-14 17:08:18873ブラウズ

Why Does Python's  = Operator on Lists Produce Unexpected Shared-State Behavior?

リストの = 演算子の予期しない動作

次のコードに示すように、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 のみが使用可能であり、新しいオブジェクトが作成されます。

要約すると、

    = 定義されている場合は
  • iadd を使用し、オブジェクトを変更しますin-place.
  • iadd が定義されていない場合、= は __add__ に戻り、新しいオブジェクトを作成します。
  • 可変オブジェクトの場合、= オブジェクトをその場で変更します.
  • 不変オブジェクトの場合、= 新しいオブジェクトを作成します。

以上がPython の = リスト上の演算子が予期しない共有状態の動作を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。