2015-05-17 35 views
5

Python中的字典应该有唯一的键。你为什么允许这样做...为什么python允许你创建带有重复键的字典

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

这不应该抛出某种错误?

+8

你可能有兴趣在阅读[关于这个确切问题Python的错误报告(https://bugs.python.org/issue16385)。解决方法:拒绝。 –

+0

为什么要这样呢?这些键仍然是唯一的,值就像预期的那样写完。没有重复的键。我相信这是一个重复的问题,我现在找不到重复的权利。 –

+1

好问题 - 我从来不知道。有趣的理由:特里似乎认为有用例可以证明有这种行为。 – GreenAsJade

回答

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

这正是他们所要求的。他们想知道**为什么它不是错误**。 –

0

它没有。它只是覆盖密钥。

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

覆盖密钥是错误的吗?它不应该。否则,当您尝试更新字典中的内容时,会出现一百万个错误。之所以如此,我认为没有错误是这样(英文解释代码):

 
d is a dictionary. 
there is a key and a value. ('a' and 'b') 
Pair them up and enter them, while saving them. 
New entry ('a' and 'c') 
key 'a' already exists; update value.