Python管理多个字典
我正在用Python3.6做一些非常基本的操作,但也在Python2.11中进行了测试-行为和字典是一样的。以下是代码示例:Python管理多个字典,python,dictionary,key,Python,Dictionary,Key,我正在用Python3.6做一些非常基本的操作,但也在Python2.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, va
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}]
问题是:“最大值”词典为什么要更改?我只修改了min_值,但min_值字典的这个新键分配也修改了max_值。我做错了什么吗?这是因为最大值和最小值是链接在一起的。也就是说,它们都引用初始值。所以,如果你改变了一个,你就改变了另一个。一种解决方案是使用deepcopy。因为您在同一个字典中给出了这两个值,只需查看代码的前两行即可 从图中可以看到,Max_value和Min_value引用初始值,这意味着Max_value和Min_value链接到创建初始值字典的地址。更新初始值内的值后,它也将同时显示在最大值和最小值中 要避免此问题,可以使用“从副本导入”deepcopy 这样,它将为旧词典创建一个新实例。您只有一个dict初始值,并且两个dict都引用相同的dict初始值。你必须抄写这篇口述才能得到另一篇口述 尝试:
max_values["zzz"] = initial_values
min_values["zzz"] = dict(initial_values)
或:
现在这是:
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}]
分配不复制。两个字典键都引用了同一个字典。您需要显式地告诉Python为两个键创建一个初始值的副本。max_values[zzz]=dictioninitial_values@Jean-Françoisfafre或max_values[zzz]=initial_values.copy.可能会起作用。它不是完全重复的,但它解释了赋值在Python中的作用。@ChristianDean您是正确的,它在Python中是预期的功能,我假设在其他语言中也是如此。对于任何愿意阅读更多关于作业和复制之间的区别的人来说,这个链接可以帮助你:事实就是这样!谢谢你的视觉表现。
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}]