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

SS *_*hah 3 dictionary python-3.x

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

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))
Run Code Online (Sandbox Code Playgroud)

还有我的日志:

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}}
Run Code Online (Sandbox Code Playgroud)

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

ill*_*der 6

在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))
Run Code Online (Sandbox Code Playgroud)