将字典一分为二 'by reference',不复制值

split dictionary in two 'by reference', not copying values

如何在不创建字典值的新副本的情况下将字典一分为二?

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 的行为,这些行为通过引用进行复制?谢谢。

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

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 是某个对象,那么你实际上是使它们指向同一事物,而不是指向两个最初相同的对象。除非您付出额外的努力,否则您不会创建新副本。