2015-04-22 13 views
-1

爲什麼x值與Ÿ更新一起,它是如何工作的任何一個因爲內部列表[1, 2, 3]正在被引用「複製」請expain這個代碼Plsease expain下面的Python代碼

x = ['foo', [1,2,3], 10.4] 
y = list(x) 
y[0] = 'fooooooo' 
y[1][0] = 4 
print x 
print y 

Output 
['foo', [4, 2, 3], 10.4] 
['fooooooo', [4, 2, 3], 10.4] 

回答

2

[1,2,3]是列表x內嵌套列表。該代碼

y = list(x) 

結合y列表x的淺拷貝,但嵌套列表保持不變。因此,通過y更新嵌套列表會影響x中引用的相同列表。

您可以通過使用is檢查:

>>> x = ['foo', [1,2,3], 10.4] 
>>> y = list(x) 
>>> x is y 
False 
>>> x[1] is y[1] 
True 

所以x[1]y[1]是同一個對象。

您可以使用copy.deepcopy(),使清單的完整副本,它的嵌套元素:

>>> from copy import deepcopy 
>>> x = ['foo', [1,2,3], 10.4] 
>>> y = deepcopy(x) 
>>> x is y 
False 
>>> x[1] is y[1] 
False 
>>> y[0] = 'fooooooo' 
>>> y[1][0] = 4 
>>> x 
['foo', [1, 2, 3], 10.4] 
>>> y 
['fooooooo', [4, 2, 3], 10.4] 

這表明嵌套列表的新實例已被複制到y,並且每個嵌套列表獨立的另一個。

+1

謝謝mhawke –

0

,沒有價值的時候,你初始化了y。因此,在xy之一內的任何更改都反映在另一箇中。

您可以使用deepcopy得到你想要的行爲:

from copy import deepcopy 
x = ['foo', [1,2,3], 10.4] 
y = deepcopy(x) 
y[0] = 'fooooooo' 
y[1][0] = 4 
print x 
print y 

輸出:

['foo', [1, 2, 3], 10.4] 
['fooooooo', [4, 2, 3], 10.4] 
1

你讓yx淺拷貝這意味着y成員名單將是相同的列表中x

>>> l = [1, 2, 3] 
>>> x = ["foo", l, 10.4] 
>>> y = list(x) 
>>> y[1] is l 
True 
>>> x[1] is l 
True 

您可以使用copy.deepcopy,使亞X贏得」的深層副本牛逼股內部引用:

>>> import copy 
>>> y = copy.deepcopy(x) 
>>> y[1] is l 
False 
>>> y[1][0] = 5 
>>> y 
['foo', [5, 2, 3], 10.4] 
>>> l 
[1, 2, 3] 
>>> x 
['foo', [1, 2, 3], 10.4] 
1

我已經通過不同的複製方法走了,followiing輸出會給出一個簡要的描述,它是如何工作

x = ['foo', [1,2,3], 10.4] 
y = list(x) //copy.copy(x) // copy.deepcopy(x) // y = x 
y[0] = 'fooooo' 
y[1][0] = 4 
print x 
print y 

Output 
deep copy ['foo', [1, 2, 3], 10.4] 
      ['fooooo', [4, 2, 3], 10.4] 

copy  ['foo', [4, 2, 3], 10.4] 
      ['fooooo', [4, 2, 3], 10.4] 

list(x) ['foo', [4, 2, 3], 10.4] 
      ['fooooo', [4, 2, 3], 10.4] 

時Y = X [ '富',[4,2,3],10.4] [ '中國| Fooooo',[4,2,3],10.4]