【发布时间】:2021-10-22 20:09:19
【问题描述】:
假设我创建了一个字典a_dictionary,其中两个键值对具有相同的键:
In [1]: a_dictionary = {'key': 5, 'another_key': 10, 'key': 50}
In [2]: a_dictionary
Out[2]: {'key': 50, 'another_key': 10}
为什么 Python 选择在这里保留最后一个键值对,而不是抛出关于使用相同键的错误(或至少引发警告)?
在我看来,这里的主要缺点是您可能会在不知情的情况下丢失数据。
(如果相关,我在 Python 3.6.4 上运行了上面的代码。)
【问题讨论】:
-
Hm... 如果
set应用于具有重复项的列表,Python 是否也应该引发异常?这似乎很相似。在您的情况下,我会说 IDE 可能会指出这一点,而不是 Python 本身。 -
我不确定我是否关注@tobias_k。当您在包含重复项的列表上运行
set()时,您期望set()函数来删除重复项,而在这里您不需要。另外值得一提的是,这里我们没有“纯”重复项,因为字典值不同。 -
但是你什么时候期待它,什么时候不期待它?例如,使用 dict 理解来获取基于某个列表的唯一值可能是完全合理的。当然,在这种完全不变的 dict 理解中,这显然是无意的,但我认为这是 IDE 的工作(或者可能是一些 linter)
-
@Alex 你应该期待它。正如您对套装的期望一样。在 3.6 版之前,您无法安全地判断哪个键:值对将保留。从 3.6 开始,它是最后插入的。
-
其实,通过快速搜索,它已经讨论过on b.p.o.。然而,拒绝很大程度上归结为“我们不会在没有讨论 -ideas 和 -dev 的情况下做出这样的重大改变”,所以你仍然必须去搜索那些邮件列表,看看是否发生过这样的讨论。 (如果确实如此,则永远不会更新该错误以提及它,但有时会发生这种情况。)至少该错误缩小了要搜索的日期范围
标签: python python-3.x dictionary