Python:如何复制字典列表

Mic*_*rce 3 python-3.x

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)

当您有一个复杂的对象(即包含其他对象的对象)时,经验法则是使用深度复制。

文档中,

浅复制和深复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例)相关:

浅拷贝构造一个新的复合对象,然后(尽可能)将引用插入到原始对象中找到的对象。

深层复制构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。