将字典一分为二 '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
值的副本,因此修改它不会修改 dict1
或 dict2
。 (遍历 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
是某个对象,那么你实际上是使它们指向同一事物,而不是指向两个最初相同的对象。除非您付出额外的努力,否则您不会创建新副本。
如何在不创建字典值的新副本的情况下将字典一分为二?
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
值的副本,因此修改它不会修改 dict1
或 dict2
。 (遍历 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
是某个对象,那么你实际上是使它们指向同一事物,而不是指向两个最初相同的对象。除非您付出额外的努力,否则您不会创建新副本。