Python管理多个词典

时间:2017-07-17 19:33:12

标签: python dictionary key

我正在使用Python(3.6,但在Python 2.11中测试 - 行为是相同的)和字典进行一些非常基本的操作。这是代码示例:

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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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)

通过这种方式,它可以为旧词典创建一个新实例。

答案 2 :(得分: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}]

答案 3 :(得分:-2)

因为您给了两个值相同的字典,只需查看代码的前两行。