我正在使用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
。我做错了吗?
答案 0 :(得分:1)
这是因为max_values和min_values链接在一起。也就是说,它们都引用initial_values。所以,如果你改变一个你改变另一个。一种解决方案是使用深度复制。
答案 1 :(得分:0)
从图表中可以看出,Max_value
和Min_value
引用了Initial_value
,这意味着Max_value
和Min_value
会链接到您创建的地址initial_value字典。更新initial_val内的值后,它还会同时显示Max_value
和Min_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)
因为您给了两个值相同的字典,只需查看代码的前两行。