假设我创建了一个字典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上运行了上面的代码。)
如果您的问题是为什么Python dict显示器最初是用这种方式设计的……可能没人知道。
我们知道何时做出决定。Python 0.9.x(1991-1993)没有字典显示。Python 1.0.x(1994)做到了。他们的工作与今天完全一样。从文档:1
词典显示将产生一个新的词典对象。
键/基准对从左到右进行评估,以定义词典的条目:每个键对象都用作词典中的键以存储相应的基准。
键值类型的限制在节类型的前面列出。
未检测到重复键之间的冲突;以给定键值存储的最后一个数据(显示中的文本最右边)为准。
并且,对其进行测试:
$ ./python
Python 1.0.1 (Aug 21 2018)
Copyright 1991-1994 Stichting Mathematisch Centrum, Amsterdam
>>> {'key': 1, 'other': 2, 'key': 3}
{'other': 2, 'key': 3}
但没有提及Guido为什么选择以下设计:
另外,如果您查看具有相似功能的不同语言,则其中一些保留像Python这样的最后一个键值对,有些保留任意的键值对,有些则引发某种错误……每种语言都有足够的余地”不能说这是一个显而易见的设计,这就是Guido选择它的原因。
如果您想要一个疯狂的猜测,可能并不比您自己想像的要好,那就是我的:
编译器不仅可以,而且确实,有效地创建一个空的字典和插入键值对到它构建常量值出文字的。因此,默认情况下,您将获得重复项允许的,最后键赢得的语义;如果您还需要其他任何内容,则必须编写额外的代码。而且,由于没有明显的理由互相挑剔,Guido选择不编写额外的代码。
所以,如果没有令人信服的理由为设计,为什么没有人尝试过,因为要改变它在24年?
好吧,有人提出了功能请求(bpo#16385),以使重复键成为3.4中的错误。但显然是在有人建议将其启动时就消失了-ideas
。)它可能已经出现了几次,但显然没有人希望它进行足够大的改动以推动它。
同时,与Terry J. Reedy的评论最接近的是关于Python现有行为的实际争论:
如果没有更多的用例和支持(来自关于python-ideas的讨论),我认为这应该被拒绝。能够重写键是Python字典的基础,也是为什么它们可用于Python的可变名称空间的基础。一次写入一次或一次写入密钥一次是另一回事。
至于文字,代码生成器可能依赖于能够编写重复键而不必返回并擦除先前的输出。
1.我不认为1.0的文档可以在任何地方直接链接,但是您可以下载整个1.0.1源代码存档并从TeX源代码构建文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句