爲什麼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]
爲什麼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]
[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
,並且每個嵌套列表獨立的另一個。
,沒有價值的時候,你初始化了y
。因此,在x
或y
之一內的任何更改都反映在另一箇中。
您可以使用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]
你讓y
的x
淺拷貝這意味着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]
我已經通過不同的複製方法走了,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]
謝謝mhawke –