先附代码。
import copy
dict1 = {'user':'runoob','num':[1,2,3]}
dict2 = dict1 # 浅拷贝: 引用对象,直接赋值的字典的键值对会随原字典的键值对而变
tmp = copy.deepcopy(dict1) # 深拷贝深拷贝父对象(一级目录)和子对象(二级目录)
#tmp = dict1.copy() # 浅拷贝:深拷贝父对象(一级目录)(字典的键,不会变了),子对象(二级目录)(字典的值)不拷贝(即修改原字典的值,浅拷贝的字典的值也会随之而改变),还是引用
#tmp = dict1
# 修改 data 数据
dict2['num'].remove(1)
dict1 = tmp
# 输出结果
print(dict1) #还是原来的
print(dict2) #已修改
解析:
把dict1赋值给dict2的时候,修改dict2的数据,会同样修改dict1的数据,需要dict1不变的时候就会出问题,这个用中间变量也不行,因为直接赋值是引用,且浅拷贝copy也不行,必须用深拷贝copy模块里的deepcopy方法,建一个中间变量深拷贝才能使修改dict2同时没有修改dict1。以上代码实现了修改dict2的数据,同时没有修改dict1的数据。
当然还有另一个解决方案是建一个空字典,然后遍历需要复制的字典,然后把每个键值对写入进空字典里。
Python 直接赋值、浅拷贝和深度拷贝解析: https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html