【发布时间】:2014-12-23 20:54:14
【问题描述】:
我正在尝试更好地理解 Python 中的浅拷贝和深拷贝,尤其是在涉及字典和列表时。
假设我有一个字典列表,我想将特定键 ('a') 的值复制到不同键名 ('x') 下的不同字典列表中:
list_dict = [{'a': 1}, {'a': 2}]
dict1 = {}
dict1['x'] = {}
list1 = []
for entry in list_dict:
dict1['x'] = entry['a']
list1.append(dict1)
>>>print list1
[{'x': 2}, {'x': 2}]
显然,这不是我想要的。但是,我知道我可以为字典指定 .copy() 以创建浅拷贝:
for entry in list_dict:
dict1['x'] = entry['a']
list1.append(dict1.copy())
>>>print list1
[{'x': 1}, {'x': 2}]
即使它很浅,它也有效。现在,让我们让它变得有点不同——我不想把它复制到dict1['x'],而是复制到dict1['x']['y']:
for entry in list_dict:
dict1['x']['y'] = entry['a']
list1.append(dict1.copy())
>>>print list1
[{'x': {'y': 2}}, {'x': {'y': 2}}]
回到第一格 - 它不起作用!所以,这是第一个问题 - 为什么它停止工作?
而第二个问题是,为什么添加最后一行会起作用?
for entry in list_dict:
dict1['x']['y'] = entry['a']
list1.append(dict1.copy())
dict1['x'] = {}
>>>print list1
[{'x': {'y': 1}}, {'x': {'y': 2}}]
非常感谢您!
附:我知道我可以先做import copy,然后再做copy.deepcopy(),但是我有兴趣了解为什么当我添加一层字典时浅拷贝会停止工作,以及为什么“重置”字典的解决方法会起作用。
【问题讨论】:
-
为什么你认为一个叫浅,一个叫深?
标签: python deep-copy shallow-copy