2015-12-09 66 views
3

我覺得這裏是個很奇怪的Python代碼,但我不知道其中的原因:爲什麼蟒蛇的行爲不符合預期

In [7]: a = [[]] * 3 

In [8]: b = [[], [], []] 

In [9]: a == b 
Out[9]: True 

In [10]: a[0].append(1) 

In [11]: b[0].append(1) 

In [12]: a == b 
Out[12]: False 

In [13]: a 
Out[13]: [[1], [1], [1]] 

In [14]: b 
Out[14]: [[1], [], []] 

爲什麼是[[1], [1], [1]]a[0].append(1)後?

類似的問題是:

In [15]: c = dict.fromkeys(range(3),[]) 

In [16]: d = {0:[], 1:[], 2:[]} 

In [17]: c == d 
Out[17]: True 

In [18]: c[0].append(1) 

In [19]: d[0].append(1) 

In [20]: c == d 
Out[20]: False 

In [21]: c 
Out[21]: {0: [1], 1: [1], 2: [1]} 

In [22]: d 
Out[22]: {0: [1], 1: [], 2: []} 

在我的理解,ab,並且c也等於d,但事實並非如此。爲什麼?誰能幫我?非常感謝!

回答

4

的第一個版本:

>>> a = [[]] * 3 

創建一個包含三次相同的列表清單。瞧元素的ID:

>>> [id(x) for x in a] 
[4454962120, 4454962120, 4454962120] 

這枚:

>>> b = [[], [], []] 

創建三個不同的列表:

>>> [id(x) for x in b] 
>>> [4454963720, 4455011592, 4454853448] 

您可以創建包含不同的子列表與列表的大名單理解:

>>> size = 100 
>>> long_list = [[] for x in range(size)] 

現在追加到第一子列表:

>>> long_list[0].append(10) 
>>> long_list[:10] 

只修改第一個子列表:

>>> long_list[:10] 
[[10], [], [], [], [], [], [], [], [], []] 
+0

謝謝!如果我想創建一個很長的列表,就像'b',例如,它將包含100個[]'s。顯然,'b = [[],[],[],...]'不是一個好的解決方案,我該如何實現它? –

+0

添加了一個示例。 –

2

[[]]*3創建3個引用到相同列表的列表,而[[],[],[]]創建3個引用到3個不同列表的列表。

2

對於這兩種ac,要創建其中被引用3次單空單。當你改變它時,所有對它的引用都會改變。對於bd,您將創建3個完全獨立的單獨空列表。

您可以通過使用is運算符來檢查兩個對象是否相同。 x is y。下面是它顯示了你的第一個例子:

>>> a = [[]] * 3 
>>> b = [[], [], []] 
>>> 
>>> a[0] is a[1] 
True 
>>> b[0] is b[1] 
False 
>>> 

而在你的第二個例子:

>>> c = dict.fromkeys(range(3), []) 
>>> d = {0:[], 1:[], 2:[]} 
>>> 
>>> c[0] is c[1] 
True 
>>> d[0] is d[1] 
False 
>>> 
0

在這兩種情況下,& 4c含有3只引用到一個空的列表,但b &ð包含3空的列表。所以當你比較他們3空的== 3空很多。

當追加到兩者的第一個元素在一個& c您追加到您有3個引用,因此所有3成爲引用單個列表[1],但在B & d你追加到第一的3列表,只有一個被更改。

以同樣的定義:

In [8]: a[0] is a[1] 
Out[8]: True 

In [9]: b[0] is b[1] 
Out[9]: False