将字典拆分为两个“按引用”,而不是复制值

时间:2015-01-19 12:11:09

标签: python dictionary split

如何在不创建字典值的新副本的情况下将字典分成两部分?

original_dict = {'foo':'spam', 'bar':'eggs'}  
keys_for_dict1 = ['foo']  
dict1 = {}; dict2 = {}  
for key in original_dict:  
    if key in keys_for_dict1:  
        dict1[key] = original_dict[key]  
    else:  
        dict2[key] = original_dict[key] 

这创建了original_dict值的重复项,因此修改它不会修改dict1dict2。 (通过original_dict.items()迭代会产生相同的行为。)我的字典中的值是非常大的对象,我想避免重新创建。对于这种分裂为二的场景,我如何捕获new_dict = original_dict的行为,这些行为通过引用进行复制?感谢。

1 个答案:

答案 0 :(得分:1)

您的代码可以满足您的需求。为了更清楚,让我们使用值列表。

original_dict = {'foo':[1,2,3], 'bar':[4,5,6]}  
keys_for_dict1 = ['foo']  
dict1 = {}; dict2 = {}  
for key in original_dict:  
    if key in keys_for_dict1:  
        dict1[key] = original_dict[key]  
    else:  
        dict2[key] = original_dict[key] 

dict1['foo'][2]='a'
print dict1['foo']
print original_dict['foo']

输出

  

[1,2,'a']

     

[1,2,'a']

因此,当我编辑dict1['foo']时,它也更改了original_dict['foo'],因为您没有创建新副本。这是同一个对象。

作为python中的一般规则,除非你付出额外的努力,当你做a=b之类的事情时,如果b是某个对象,那么你实际上是指它们指向相同的事情,不是两个最初相同的对象的指针。除非您付出额外的努力,否则不会创建新副本。