Python管理多个字典

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

我正在用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, 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}]