1

リストがあるとします:

L = [1,2,3]

L[0]そして私は変数に割り当てましたa

a = L[0]

その後、変更aしても影響はありませんL

a = a + 1
print L # [1,2,3] not affected

なぜこうなった?Pythonはすべてを参照で渡しているのではないですか? 私はそれaが指していると思いましたL[0]

4

4 に答える 4

3

問題は、aL[0]が不変オブジェクトへの参照であるため、それらのいずれかを変更しても他の参照には影響しないことです。

>>> L = [1, 2, [3]]
>>> a = L[0]
>>> a = a + 1

aは新しいオブジェクトをL[0]指すようになりましたが、それでも同じオブジェクトを指しています。

>>> a, L[0]   
(2, 1)

この場合b、 とL[2]は変更可能なオブジェクト ( list) への参照であり、それらに対するインプレース操作はすべての参照に影響します。

>>> b = L[2]
>>> b.append(4)  #list.append is an in-place operation
>>> b, L[2]
([3, 4], [3, 4])

>>> b = b + [5]  #mutable object, but not an in-place operation 
>>> b            #b is assigned to new list object
[3, 4, 5]
>>> L[2]         #L[2] is unchanged
[3, 4]
于 2013-09-25T06:40:49.530 に答える
0

割り当てを次のように変更します。

a = L

L を次のように変更すると、次のようになります。

L[0] += 1

a も変化することがわかります。これが参照マジックです。

于 2013-09-25T06:52:29.470 に答える