ホームページ >バックエンド開発 >Python チュートリアル >Python でのシーケンス増分割り当ての簡単な紹介 (例付き)

Python でのシーケンス増分割り当ての簡単な紹介 (例付き)

不言
不言転載
2018-10-08 16:29:243074ブラウズ

この記事では、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 サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。