2017-07-17 85 views
0

我正在做一些Python基本操作(3.6,但也在Python 2.11中测试 - 行为是相同的)和字典。下面是代码示例:Python管理多个词典

max_values = dict() 
min_values = dict() 

initial_values = {"stat": 2, "value": 5.5} 

max_values["zzz"] = initial_values 
min_values["zzz"] = initial_values 

到目前为止好,当我打印这些字典:

for key, value in max_values.items(): 
    print("[%s] Key [%s] -> Value [%s]" % ("max_values", key, value)) 

for key, value in min_values.items(): 
    print("[%s] Key [%s] -> Value [%s]" % ("min_values", key, value)) 

我得到我预期的结果:

[max_values] Key [zzz] -> Value [{'stat': 2, 'value': 5.5}] 
[min_values] Key [zzz] -> Value [{'stat': 2, 'value': 5.5}] 

但是,如果我尝试修改与值,例如:

min_values["zzz"]["value"] = 1.0 

并再次做同样的打印,我得到:

[max_values] Key [zzz] -> Value [{'stat': 2, 'value': 1.0}] 
[min_values] Key [zzz] -> Value [{'stat': 2, 'value': 1.0}] 

的问题是:为什么在max_values字典改变?我只修改min_values,但这个新的关键任务min_value字典也修改max_values。难道我做错了什么?

+4

确认** _不复制_ **。这两个词典键都有对同一个词典的引用。您需要明确告诉Python为两个键创建'initial_values'副本。 –

+1

'max_values [“zzz”] = dict(initial_values)' –

+1

@ Jean-FrançoisFabre或'max_values [“zzz”] = initial_values.copy()'。 –

回答

0

你只有一个字典initial_values和你的字典都指的是相同的字典initial_values。你必须复制这个词典来得到另一个字典。

尝试:

max_values["zzz"] = initial_values 
min_values["zzz"] = dict(initial_values) 

或:

max_values["zzz"] = initial_values 
min_values["zzz"] = initial_values.copy() 

现在这个结构:

min_values["zzz"]["value"] = 1.0 

for key, value in max_values.items(): 
    print("[%s] Key [%s] -> Value [%s]" % ("max_values", key, value)) 

for key, value in min_values.items(): 
    print("[%s] Key [%s] -> Value [%s]" % ("min_values", key, value)) 

获得预期的结果:

[max_values] Key [zzz] -> Value [{'stat': 2, 'value': 5.5}] 
[min_values] Key [zzz] -> Value [{'stat': 2, 'value': 1.0}] 
1

这是因为max_values和min_values链接在一起。也就是说,它们都是引用initial_values。所以如果你改变一个你改变另一个。一种解决方案是使用deepcopy。

-2

因为你给了两个值相同的字典只看你的代码的前两行。

0

enter image description here

正如可以从该图中,Max_valueMin_value参照Initial_value,这意味着Max_valueMin_value链接到创建initial_value字典的地址看到。一旦更新了initial_val内的值,它也会同时显示在Max_valueMin_value之间。

为了避免这个问题,你可以使用from copy import deepcopy.

my_dict = {'1': 1, '1': 2} 
new_dict= deepcopy(my_dict) 

通过这种方式,它创造了旧字典一个新的实例。

+0

就是这样!感谢您的视觉表达。 – buuren