【发布时间】:2012-01-07 18:02:07
【问题描述】:
我想将字典复制到新变量中,而不维护与先前变量的链接。
【问题讨论】:
标签: python python-3.x
我想将字典复制到新变量中,而不维护与先前变量的链接。
【问题讨论】:
标签: python python-3.x
from copy import deepcopy
new_dict = deepcopy(orig_dict)
dict.copy() 创建浅拷贝,这意味着,如果您的字典包含其他容器对象,如列表、元组等。它们将被再次引用而不是重复!
您可以自己尝试:
a = {1:{1:2}}
print id(a[1])
>>> 159584844
b = a.copy()
print id(b[1])
>>> 159584844
c = deepcopy(a)
print id(c[1])
>>> 159575276
【讨论】:
.copy 从来都不是一个好工具,那它为什么存在?
字典上的.copy 方法就足够了。
dict1 = {'foo': 'bar'}
dict2 = dict1.copy()
dict1['bar'] = 'baz'
dict2['bar'] = 'bif'
print(dict1, dict2)
这些输出:
{'foo': 'bar', 'bar': 'baz'} {'foo': 'bar', 'bar': 'bif'}
如果您想完全删除对dict1 的引用,您可以只使用del dict1。
如果您担心字典内部对变量的引用,可以使用copy 模块中的deepcopy。
【讨论】:
没有“将对象复制到新变量”之类的东西。你可以复制一个对象;这会创建一个新对象。一个对象可能有 0、1 或多个名称(您称之为“变量”)。是否给新对象命名取决于您——例如foo = d.copy() - 或者让它无名 - 例如some_function(d.copy()).
可以使用浅拷贝或深拷贝来复制对象。请参阅copy module。深层副本是否实现了“不维护与先前变量的链接”的意思?如果不是,请澄清。
【讨论】:
您可以使用 dict.pop() 访问 dict 的条目并在一个步骤中将其删除。这是一个dict dd的创建,然后从dd中提取条目并构造zz:
>>> dd = dict(zip("ABC","123"))
>>> print dd
{'A': '1', 'C': '3', 'B': '2'}
>>> zz = dict((k,dd.pop(k)) for k in dd.keys())
>>> print zz
{'A': '1', 'C': '3', 'B': '2'}
>>> print dd
{}
所以在创建 zz 之后,所有的值都已从 dd 中删除。如果您想做一些选择性的事情,请在字典中添加 if condition:
>>> dd = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ", range(1,27)))
>>> vowels = "AEIOU"
>>> zz = dict((k,dd.pop(k)) for k in dd.keys() if k not in vowels)
>>> dd
{'A': 1, 'E': 5, 'I': 9, 'O': 15, 'U': 21}
>>> zz
{'C': 3, 'B': 2, 'D': 4, 'G': 7, 'F': 6, 'H': 8, 'K': 11, 'J': 10, 'M': 13, 'L': 12, 'N': 14, 'Q': 17, 'P': 16
, 'S': 19, 'R': 18, 'T': 20, 'W': 23, 'V': 22, 'Y': 25, 'X': 24, 'Z': 26}
【讨论】: