2014-09-21 71 views
4

創建4名相同列表L1,L2,L3的列表,L4蟒list.append() - 不一致輸出

>>> L0 = [[1]] 
>>> L1 = [[1],[1]] 
>>> L2 = [[1] for i in range(2)] 
>>> L3 = L0 + L0 
>>> L4 = [[1]] * 2 

>>> L1 
[[1], [1]] 
>>> L2 
[[1], [1]] 
>>> L3 
[[1], [1]] 
>>> L4 
[[1], [1]] 

>>> L1 == L2 == L3 == L4 
True 

而在每個

>>> L1[0].append(2) 
>>> L2[0].append(2) 
>>> L3[0].append(2) 
>>> L4[0].append(2) 
申請list.append()到所述第一元件

與結果

>>> L1 
[[1, 2], [1]] 
>>> L2 
[[1, 2], [1]] 
>>> L3 
[[1, 2], [1, 2]] 
>>> L4 
[[1, 2], [1, 2]] 

有人可以請解釋L3和L4的輸出?

回答

1

在所有這些情況下,列表由引用到其中的其他列表組成。在L3L4的情況下,它們是包含對單個其他列表(L0L3L4單個即時列表[1])的列表。

這就是[...]*2語法的含義 - 使兩個引用到基本列表中找到的條目。

當您追加時,您將修改引用列表的所有位置。

換句話說,當你修改L3[0],要修改件事L3[1]也指,所以以後當你查詢,看看有什麼L3[1]的樣子,它反映的是什麼已經參照目前修改的版本一直。

列表之間的相等性是根據它們包含的有序元素的相等性定義的。這將遞歸應用於列表的列表,等等。所以在基地,你的平等檢查是一個關於列表內整數的問題,並且關於實際列表對象實例的:

In [24]: x = [[1]] 

In [25]: y = [[1]] 

In [26]: x[0] 
Out[26]: [1] 

In [27]: y[0] 
Out[27]: [1] 

In [28]: x[0] == y[0] 
Out[28]: True 

In [29]: id(x[0]) 
Out[29]: 140728515456032 

In [30]: id(y[0]) 
Out[30]: 140728514976728 
1

因爲L3和L4實際上是引用,所以當你附加到L3 [0]和L4 [0]時,你實際上修改了它們引用的內容。