我想将字典复制到新变量中而不保持与先前变量的链接。
答案 0 :(得分:14)
from copy import deepcopy
new_dict = deepcopy(orig_dict)
dict.copy()创建浅拷贝,这意味着,如果你的字典包含其他容器对象,如list,tuples等,它们将被再次引用而不会重复!
你可以尝试自己:
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
答案 1 :(得分:6)
字典上的.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
。
如果您担心在字典中引用 字典,则可以使用deepcopy
模块中的copy
。
答案 2 :(得分:4)
没有“将对象复制到新变量”这样的事情。你可以复制一个对象;这会创建一个新对象。对象可以有0,1或多个名称(您称之为“变量”)。是否为新对象命名是由您决定的 - 例如foo = d.copy()
- 或者让它无名 - 例如some_function(d.copy())
。
可以使用浅副本或深副本复制对象。请参阅copy module。深层复制是否实现了“不保持与先前变量的链接”的意思?如果没有,请澄清。
答案 3 :(得分:1)
您可以使用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}