この記事では、Python でのシーケンスの増分代入について簡単に紹介します (例とともに)。これには一定の参考価値があります。必要な友人は参照できます。お役に立てば幸いです。
増分代入演算子には = と *=。 = 背後にある特別なメソッドは __iadd__ です。クラスが __iadd__ メソッドを実装していない場合、Python は一歩下がってそのメソッドを呼び出します __add__ メソッド。これら 2 つのメソッドの違いは、__iadd__ はインプレース変更であり、元の値のメモリ アドレスを変更しないのに対し、__add__ メソッドは新しいオブジェクトを取得することです。
次の式を考えてみましょう:
a = b
a が __iadd__ メソッドを実装する場合、a はその場で変更されます (メモリ アドレスは変更されません)。 a が __iadd__ メソッドを実装していない場合、式 a = b の効果は a = a b と同じになり、新しいオブジェクトが生成されて a に割り当てられます。
一般に、変数シーケンスは通常 __iadd__ メソッドを実装するため、= はインプレース加算ですが、不変シーケンスはこの操作をまったくサポートしません。
*= は = と同じですが、その背後にある特別なメソッドが __imul__ である点が異なります。
a = [1, 2, 3] b = [4, 5, 6]print("id(a) = %d" % id(a)) a += bprint("id(a) = %d" % id(a)) c = [1, 2, 3]print("id(c) = %d" % id(c)) c = c + bprint("id(c) = %d" % id(c)) d = (1, 2, 3)print("id(d) = %d" % id(d)) d *= 2print("id(d) = %d" % id(d))
実行結果は次のとおりです。
id(a) = 1298277978824 id(a) = 1298277978824 id(c) = 1298277978696 id(c) = 1298277978632 id(d) = 1298277972872 id(d) = 1298277136616
の増分割り当てを理解します。シーケンス、2013 年の Python ブラジル カンファレンスで Leonardo Rochael が言及したパズルを見てみましょう:
t = (1, 2, [30, 40]) t[2] += [50, 60]
A. t は (1, 2, [30 , 40, 50, 60])
B. タプルはその要素への代入をサポートしていないため、TypeError 例外がスローされます
#C. 上記のどちらも D. A と B はどちらも正しいです 私と同じように B を選ぶ人も多いと思いますが、実際の答えは D です。コンソールでコードを実行すると、結果は次のようになります:概要: 1. スプライシング操作を繰り返し実行した場合不変シーケンスの場合、毎回新しいシーケンスを作成し、元のシーケンスの要素を新しいシーケンスにコピーし、新しい要素を追加する必要があるため、効率は非常に低くなります。 2. 可変オブジェクトをタプルに入れないでください。 3. インクリメンタル代入はアトミックな操作ではないので、例外をスローしても t の値は変化しないことがわかりました。
以上がPython でのシーケンス増分割り当ての簡単な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。