将字典复制到新变量中,而不保持与前一个变量的链接

时间:2012-01-07 18:02:07

标签: python python-3.x

我想将字典复制到新变量中而不保持与先前变量的链接。

4 个答案:

答案 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)

请参阅dict.copy method

没有“将对象复制到新变量”这样的事情。你可以复制一个对象;这会创建一个新对象。对象可以有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}