簡體   English   中英

它如何在Python的復制和內存系統中工作?

[英]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[:]都可以復制,但是只有一層深 在第一級以下,僅引用被復制。 這就是為什么您沒有在第二層看到期望的原因。

例如,使用以下命令時, datadata1id會有所不同:

data1 = list(data)

但是內部列表仍將指向相同的對象並具有相同的id ,這就是為什么您必須使用deepcopy將原始data的全部內容復制到新對象的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM