2017-08-06 71 views
0

我感到困惑與下面的代碼Python的共享引用

L1 = [3,6,9,12] 
L2 = [L1]*3 
L3=[list(L1)]*3 
L4 = [list(L1) for i in range(3)] 
L1[0]=100 

L2 
[[100, 6, 9, 12], [100, 6, 9, 12], [100, 6, 9, 12]] 

L3 
[[3, 6, 9, 12], [3, 6, 9, 12], [3, 6, 9, 12]] 

L4 
[[3, 6, 9, 12], [3, 6, 9, 12], [3, 6, 9, 12]] 

爲什麼L3L4不會受代碼第五行?這意味着只有L2L1共享對象。有人可以解釋爲什麼L3L4不創建共享對象,只有L2呢?

回答

0

list(foo)創建一個新的列表對象,該對象複製foo中各項的各個值。因此,修改foo對象(在您的情況下,L1)不會影響新列表中的值。

L2是一個列表,其中包含3個參考L1

L3L4是每個包含L1的3個副本的列表。

您可以使用id()函數來觀察這一點。

+0

特別是它淺 - 複製列表;改變整個元素將不會反映這些改變,但會改變意志內的任何對象。 –