2017-08-26 57 views
0

本质上我试图给嵌套字典赋值。如果我通过拼写出来构建词典,那么稍后分配一个值就可以按预期工作。但是,如果我创建了一个模板字典,请将其分配给所有键,然后再返回并尝试为嵌套键分配一个值,现在该键的每个实例都会获取该值。更方便地显示与代码:为嵌套字典分配值被不恰当地应用于所有键

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被分配以x为[“富”] [“一” ]和['BAR'] ['a']如果我使用模板构建它,但是如果我已经写出了完整的字典(以y开头)。我在上面进行测试以确保x和y在尝试赋值之前是真正等价的。

+0

看initialize_dict的价值,你可能会感到惊讶。 –

回答

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))