ホームページ >バックエンド開発 >Python チュートリアル >Python の = 演算子はリストとその __iadd__ および __add__ メソッドでどのように動作しますか?

Python の = 演算子はリストとその __iadd__ および __add__ メソッドでどのように動作しますか?

DDD
DDDオリジナル
2025-01-01 04:32:09787ブラウズ

How Does Python's  = Operator Behave with Lists and Their __iadd__ and __add__ Methods?

リスト公開の代入演算子 =

Python では、= 演算子は、適用されるオブジェクトのタイプに応じて異なる機能を持ちます。リストで使用すると、予期しない動作がいくつか発生しますが、これは呼び出す基礎となる特別なメソッドを理解することで説明できます。

一般に、= はインプレース加算のために __iadd__ 特別なメソッドを呼び出そうとします。存在しない場合は、代わりに __add__ を使用します。

__iadd__ によるインプレース変更

可変型であるリストの場合、Python は __iadd__ メソッドを提供します。 = に遭遇すると、Python はリストの __iadd__ を呼び出し、変更して要素を追加できるようにします。

__add__ による新しいオブジェクトの作成

リストに __iadd__ メソッドがない場合、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)

f.bar += [3]
print(f.bar)
print(g.bar)

f.bar = f.bar + [4]
print(f.bar)
print(g.bar)

f = foo2(1)
g = foo2(2)
print(f.bar)
print(g.bar)

出力:

[1, 2]
[1, 2]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3]
[1]
[2]
  • 用foo では、__iadd__ と __add__ の両方が定義されていません。したがって、= は新しいリストを作成し、それを bar 属性に割り当てます。これはすべてのインスタンス間で共有されます。
  • foo2 の場合、__add__ は定義されていますが、__iadd__ は定義されていません。その結果、= は新しいリストを作成し、共有リストを変更せずに bar 属性に割り当てます。

__iadd__ と __add__ の違いを理解することで、リストに対する = の動作を予測し、予期せぬ事態を防ぐことができます。

以上がPython の = 演算子はリストとその __iadd__ および __add__ メソッドでどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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