[英]How does it work for Python's copy and memory system?
它如何用於Python的內存引用?
當我在矩陣上嘗試程序時,我使用了嵌套列表。 然后,我發現原始數據被突變了,即使我復制了它。 我嘗試了幾種方法。 最后,我使用copy.deepcopy()解決了問題。 那么,Python的復制和引用函數是什么意思。 我們如何避免這種s-(問題)。
data = [
[1,0,0,1,0,0,1,1,1],
[1,0,1,0,0,0,0,1,0],
[1,1,0,0,0,0,0,1,0],
[1,0,1,0,0,0,0,1,0],
[1,0,0,1,0,0,1,1,1],
[0,0,0,0,0,0,0,0,0],
]
# data1 = data.copy() # нет
# data1 = data[:] # нет
# data1 = list(data) # нет
# data1 = list(data) # нет
# data1 = copy.copy(data) # нет
# for all of above five, data1 will change with data, even they differ from ID
對於這五個,我們將看到:
data[0][0] = 0
print(id(data))
print(id(data1))
print(data)
print(data1)
# Out:
# 4450009608
# 4450115528
# [[0, 0, 0, 1, 0, 0, 1, 1, 1], [1, 0, 1, 0, 0, 0, 0, 1, 0], [1, 1, 0, 0, 0, 0, 0, 1, 0], [1, 0, 1, 0, 0, 0, 0, 1, 0], [1, 0, 0, 1, 0, 0, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
# [[0, 0, 0, 1, 0, 0, 1, 1, 1], [1, 0, 1, 0, 0, 0, 0, 1, 0], [1, 1, 0, 0, 0, 0, 0, 1, 0], [1, 0, 1, 0, 0, 0, 0, 1, 0], [1, 0, 0, 1, 0, 0, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
因此,我們必須使用Deepcopy,這樣的小坑。
這個data1 = data.copy()
和這個data1 = data[:]
都可以復制,但是只有一層深 。 在第一級以下,僅引用被復制。 這就是為什么您沒有在第二層看到期望的原因。
例如,使用以下命令時, data
和data1
的id
會有所不同:
data1 = list(data)
但是內部列表仍將指向相同的對象並具有相同的id
,這就是為什么您必須使用deepcopy
將原始data
的全部內容復制到新對象的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.