3

重複の可能性:
プラスイコール (+=) は Python で何をしますか?

奇妙な問題に気付きました:

    l1 = ['1', '2', '3']
    l2 = l1

    item = l2.pop(0)
    # the pop operation will effect l1
    print l1

    l2 = l2 + [item]
    # why "l2 = l2 + [item]" does't effect l1 while "l2 += [item]" does.
    print l2
    print l1

出力は次のとおりです。

['2', '3']
['2', '3', '1']
['2', '3']

しかし、に変更l2 = l2 + [item]するl2 += [item]と、出力は次のようになります。

['2', '3']
['2', '3', '1']
['2', '3', '1']
4

2 に答える 2

6

+とは、 here で+=説明されているように、異なる内部的な意味を持つ異なる演算子です。

l2 = l1 + xを呼び出しますがl2 = l1.__add__(x)、それが機能しない場合は を呼び出しますx.__radd__(l1)。両方とも、操作の結果を形成する新しいオブジェクトを返す必要があり、古いオブジェクトから独立しているため、影響はありませんl1

l2 += x呼び出しl2 = l2.__iadd__(x)(「拡張割り当て」) を実行し、これが機能しない場合にのみ、l2 = l2 + x上記のようにフォールバックします。

数値の場合、それらは不変であり、したがって で変更できないため、どちらも同じですが、+=リストで+は新しいオブジェクトを返し+=、左側のオブジェクトを変更します。

背後のオブジェクトl2が変更されl1、同じオブジェクトを参照しているため、変更l1も同様にわかります。

于 2012-11-11T09:43:58.413 に答える
1

を割り当てた後、はとl2 = l1同じl2ですl1。次の操作は両方にpop影響し、同じであるためです。l1l2

l2 = l2 + [item]新しいリストを作成します。これl2で別のオブジェクトになりました。

l2 += [item]インプレースで変更しl2ます。したがってl2、と同じことを指しl1ます。

コード実行のインタラクティブな視覚化:

いくつかの関連リンク:

于 2012-11-11T09:35:08.267 に答える