将值分配给嵌套字典不适当地应用于所有键

时间:2017-08-26 06:25:59

标签: python-3.x dictionary

基本上我试图为嵌套字典赋值。如果我通过拼写来构建字典,那么稍后分配值将按预期工作。但是,如果我创建一个模板字典,将其分配给所有键,然后返回并尝试为嵌套键赋值,现在该键的每个实例都获得该值。使用代码更容易显示:

initialize_dict = {'a':0,'b':0}
x = {}
x['FOO'] = initialize_dict
x['BAR'] = initialize_dict

y = {'FOO':{'a':0,'b':0},'BAR':{'a':0,'b':0}}

logging.info("x is {}".format(x))
logging.info("y is {}".format(y))
logging.info(x==y)

x['FOO']['a']=13231
y['FOO']['a']=13231

logging.info("new x is {}".format(x))
logging.info("new y is {}".format(y))

我的日志:

INFO:root:x is {'FOO': {'a': 0, 'b': 0}, 'BAR': {'a': 0, 'b': 0}}
INFO:root:y is {'FOO': {'a': 0, 'b': 0}, 'BAR': {'a': 0, 'b': 0}}
INFO:root:True
INFO:root:new x is {'FOO': {'a': 13231, 'b': 0}, 'BAR': {'a': 13231, 'b': 0}}
INFO:root:new y is {'FOO': {'a': 13231, 'b': 0}, 'BAR': {'a': 0, 'b': 0}}

正如您所看到的,由于某种原因,值13231被分配到[' FOO'] [' a']和[' BAR' ] [' a']如果我使用模板构建它,但如果我已经写出了完整的字典(y)。我在上面测试以确保在尝试分配任何值之前x和y是真正等效的。

1 个答案:

答案 0 :(得分:1)

在Python中,当您分配变量时,您将名称绑定到某个对象。在这种情况下,x['FOO']x['BAR']是绑定到同一对象的名称。当您更改x['FOO']['a']时,您要更改单个对象中的密钥'a'x['FOO']x['BAR']都会引用该密钥。

x['FOO']['a']分配值时,您正在更改x['FOO']['a']x['BAR']['a']initialize_dict['a']的值。

要解决此问题,您只需让x['FOO']x['BAR']引用initialize_dict的副本,以便每个人都可以独立更改:

initialize_dict = {'a':0,'b':0}
x = {}
x['FOO'] = initialize_dict.copy()  # Make copies of the dictionary.
x['BAR'] = initialize_dict.copy()  #

y = {'FOO':{'a':0,'b':0},'BAR':{'a':0,'b':0}}

print("x is {}".format(x))
print("y is {}".format(y))
print(x==y)

x['FOO']['a']=13231
y['FOO']['a']=13231

print("new x is {}".format(x))
print("new y is {}".format(y))
相关问题