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