为什么Python允许创建具有重复键的字典

5

在Python中,字典的键(key)应该是唯一的。为什么你可以这样做呢...

d = {'a' : 'b', 'a' : 'c'}

这不应该抛出某种错误吗?


8
您可能有兴趣阅读关于这个问题的Python错误报告(https://bugs.python.org/issue16385)。解决方案:已被拒绝。 - Greg Hewgill
为什么要这样做呢?键是唯一的,值只是按预期进行覆盖。没有重复的键。我确定这也是一个重复的问题,只是我现在找不到重复的地方。 - user177800
1
好问题 - 我从来不知道。有趣的理由:特里似乎认为存在使用情况,需要这种行为。 - GreenAsJade
2个回答

6
>>> d = {'a' : 'b', 'a' : 'c'}
>>> d
{'a': 'c'}

不,你只是在使用已存在的键初始化字典,这只是覆盖了现有键的当前值。
>>> dis.dis("d = {'a' : 'b', 'a' : 'c'}")
  1           0 BUILD_MAP                2
              3 LOAD_CONST               0 ('b')
              6 LOAD_CONST               1 ('a')
              9 STORE_MAP
             10 LOAD_CONST               2 ('c')
             13 LOAD_CONST               1 ('a')
             16 STORE_MAP
             17 STORE_NAME               0 (d)
             20 LOAD_CONST               3 (None)
             23 RETURN_VALUE

>>> dis.dis("d={};d['a']='b';d['a']='c'")
  1           0 BUILD_MAP                0
              3 STORE_NAME               0 (d)
              6 LOAD_CONST               0 ('b')
              9 LOAD_NAME                0 (d)
             12 LOAD_CONST               1 ('a')
             15 STORE_SUBSCR
             16 LOAD_CONST               2 ('c')
             19 LOAD_NAME                0 (d)
             22 LOAD_CONST               1 ('a')
             25 STORE_SUBSCR
             26 LOAD_CONST               3 (None)
             29 RETURN_VALUE

如您所见,两种初始化的方式有些相似:首先存储第一个键值对,然后是第二个。


3
这正是他们所询问的。他们想知道为什么这不是错误。 - Martijn Pieters

0

不会的,它只是覆盖键。

>>> d = {'a' : 'b', 'a' : 'c'}
>>> d
{'a': 'c'}

覆盖键是错误吗?不应该是的。否则,当您尝试在字典中更新事物时,会出现无数个错误。我认为没有错误的原因是这样的(用英语解释代码):

d是一个字典。
有一个键和一个值。 ('a'和'b')
将它们配对并输入,同时保存它们。
新条目('a'和'c')
键'a'已经存在;更新值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接