編集:(質問には、編集内容が提起した追加的な問題に対処するために):
a = a + b
とa += b
同じ操作ではありません。前者はa.__add__(b)
を実行し、後者はa.__iadd__(b)
を実行します(「インプレース追加」)。
2つの違いは、前者は常に新しいオブジェクトを作成し(その新しいオブジェクトに名前a
を再バインドします)、後者はオブジェクトをインプレースで変更します(リストを使用すると、 )。
>>> a = [1, 2]
>>> id(a)
34660104
>>> a = a + [a]
>>> id(a)
34657224
>>> id(a[2])
34660104
「新しい」a
が最初に参照を連結し、その後、古いリストa
から値を取って、ゼロから構築した:、これを説明するだけで、あなたのオブジェクトのアドレスを見て
それに古いオブジェクト。
コントラストこれに:
>>> a = [1, 2]
>>> id(a)
34658632
>>> a += [a]
>>> id(a)
34658632
>>> id(a[2])
34658632
(旧答え、説明の循環参照):
これを考えてみましょう:
>>> a = [1, 2]; a += a
>>> a
[1, 2, 1, 2]
>>> a = [1, 2]; a.extend(a)
>>> a
[1, 2, 1, 2]
>>> a = [1, 2]; a += [a]
>>> a
[1, 2, [...]]
>>> a = [1, 2]; a.append(a)
>>> a
[1, 2, [...]]
をだから、最初の部分を要約する:
を
リストでは、a += a
は、この操作の開始時にa
で見つかった要素のコピーを追加して、インプレースa
を変更を呼び出すのと同じです。
は逆に、a += [a]
リストa
への参照を作成両方とも、a.append(a)
に対応する(すなわちする。メモリ内のアドレスへのポインタ)とリストにことを追加します。これは、いわゆる「循環基準」を構成する。
あなたはその時点でa
の内部表現を見ていたならば、それは次のようになります。
a: Reference to a list object at address 0xDEADBEEF
a[0]: Reference to the integer object "1"
a[1]: Reference to the integer object "2"
a[2]: Reference to the same list object at address 0xDEADBEEF
古いバージョンのPython(前1.5.1)がそれを検出するのに十分にスマートではなかったですあなたがprint a
を行うことであるかのように、あなたは無限ループに[1, 2, [1, 2, [1, 2, [1, 2, [1, 2, [1, 2, ...
などを取得したいです。 Python 1.5.1以降、インタプリタはこれを検出して代わりに[1, 2, [...]]
を出力します。
http://stackoverflow.com/questions/2347265/what-does-plus-equals-do-in-python – Dogbert
'= [1、2]。 a + = a'は '[1,2、[1,2]]ではなく、[1,2,1,2]となります。重複した質問を参照してください。 – khachik
いわゆる重複は省略記号リストは*すべての*については説明しません。 – Marcin