我想在python中制作一个 dict
的深层副本 . 不幸的是 dict
不存在 .deepcopy()
方法 . 我怎么做?
>>> my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
>>> my_copy = my_dict.deepcopy()
Traceback (most recent calll last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'deepcopy'
>>> my_copy = my_dict.copy()
>>> my_dict['a'][2] = 7
>>> my_copy['a'][2]
7
最后一行应该是 3
.
我希望 my_dict
中的修改不会影响快照 my_copy
.
我怎么做?该解决方案应与Python 3.x兼容 .
4 回答
怎么样:
Python 2或3:
Python 3.x
from copy import deepcopy
没有深度复制,我无法从我的域字典中删除主机名字典 .
没有深度检查我得到以下错误:
...当我尝试从另一个字典里面的字典中删除所需的元素时 .
domain是一个字典对象
示例输出:[orginal] domains = {'localdomain': {'localhost': {'all': '4000'}}}
[新] domains = {'localdomain': {} }}
所以这里发生的是我正在迭代字典的副本而不是遍历字典本身 . 使用此方法,您可以根据需要删除元素 .
一个更简单的(在我看来)解决方案是创建一个新的字典并使用旧字典的内容更新它:
这种方法的问题是它可能不够“足够深” . 即不是递归深度的 . 对于简单对象而言不够,但对于嵌套字典则不够 . 这是一个可能不够深的例子:
通过使用Deepcopy(),我可以消除半浅的行为,但我认为必须确定哪种方法适合您的应用程序 . 在大多数情况下,你可能不在乎,但应该意识到可能存在的陷阱...最后的例子:
dict.copy() 是字典的浅拷贝函数
id 是内置函数,为您提供变量的地址
首先,您需要了解“为什么会出现这个特殊问题?”
键'a'的两个词组中出现的列表的地址指向相同的位置 .
因此,当您更改my_dict中列表的值时,my_copy中的列表也会更改 .
Solution:
或者您可以使用上面提到的深度复制 .