Python 3。我试图复制字典列表而不更改原始列表。这似乎与复制列表的工作方式不同:
词典列表
list_of_dict = [{"A":"a", "B": "b"}]
table_copy = list(list_of_dict)
for x in table_copy:
x['B'] = 1
print(list_of_dict)
print(table_copy)
Run Code Online (Sandbox Code Playgroud)
产量
[{'A': 'a', 'B': 1}]
[{'A': 'a', 'B': 1}]
Run Code Online (Sandbox Code Playgroud)
作为参考,复制列表如下所示:
orig_list = [1,2,3]
copy_list = list(orig_list)
copy_list[1] = "a"
print(orig_list)
print(copy_list)
Run Code Online (Sandbox Code Playgroud)
产生我们期望的结果
[1, 2, 3]
[1, 'a', 3]
Run Code Online (Sandbox Code Playgroud)
实际上如何复制字典列表?
小智 5
通过这行代码,table_copy = list(list_of_dict)您正在创建一个新的
指针(变量),但底层元素不会被复制(这是浅复制)
list_of_dict = [{"A":"a", "B": "b"}]
table_copy = list(list_of_dict)
id(list_of_dict)
Out[8]: 2208287332232
id(table_copy)
Out[9]: 2208275740680
id(list_of_dict[0])
Out[10]: 2208275651624
id(table_copy[0])
Out[11]: 2208275651624 <== equal to id(list_of_dict[0])
Run Code Online (Sandbox Code Playgroud)
您应该使用标准库中的复制模块,它带有两个有用的函数
复制(x):
返回 x 的浅拷贝。
深复制(x):
返回 x 的深层副本。
对于你的问题,
from copy import deepcopy
list_of_dict = [{"A":"a", "B": "b"}]
table_copy = deepcopy(list_of_dict)
Run Code Online (Sandbox Code Playgroud)
当您有一个复杂的对象(即包含其他对象的对象)时,经验法则是使用深度复制。
从文档中,
浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:
浅拷贝构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中找到的对象。
深层复制构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。