假设我创建了一个字典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)没有dict显示; Python 1.0.x(1994)做到了.他们的工作方式与今天完全相同.来自文档:1
A dictionary display yields a new dictionary object.
The key/datum pairs are evaluated from left to right to define the
entries of the dictionary: each key object is used as a key into the
dictionary to store the corresponding datum.
Restrictions on the types of the key values are listed earlier in
section types.
Clashes between duplicate keys are not detected; the last
datum (textually rightmost in the display) stored for a given key
value prevails.
并且,测试它:
$./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选择了这个设计:
> 1.0文档.
> Design & History FAQ.
> Guido的History of Python博客.
>我能想到的任何其他地方都可能有它.
此外,如果你看一下具有相似功能的不同语言,其中一些语言保留最后一个键值对,如Python,有些保留一个任意的键值对,有些会产生某种错误…每个都有足够的你可以’认为这是一个明显的设计,这就是Guido选择它的原因.
如果你想要一个疯狂的猜测,可能并不比你自己想象的更好,这是我的:
编译器不仅可以,而且可以通过创建空字典并将键值对插入其中来有效地构造文字中的const值.因此,默认情况下,您将获得重复允许的最后一键胜利语义;如果你想要其他任何东西,你必须编写额外的代码.并且,没有令人信服的理由选择一个而不是另一个,Guido选择不写额外的代码.
那么,如果设计没有令人信服的理由,为什么没有人试图在24年后改变它呢?
好吧,有人提交了一个功能请求(b.p.o. #16385),使重复键在3.4中出错.
但是当它被建议把它提起来时显然已经消失了.)它可能会出现在其他几次,但显然没有人希望它变得非常糟糕以推动它.
与此同时,他最接近Python现有行为的实际论点是Terry J. Reedy的评论:
Without more use cases and support (from discussion on python-ideas), I think this should be rejected. Being able to re-write keys is fundamental to Python dicts and why they can be used for Python’s mutable namespaces. A write-once or write-key-once dict would be something else.
As for literals, a code generator could depend on being able to write duplicate keys without having to go back and erase previous output.
1.我不认为1.0的文档可以在任何地方直接链接,但您可以下载the whole 1.0.1 source archive并从TeX源构建文档.
标签:python,dictionary,python-3-x
来源: https://codeday.me/bug/20190527/1161868.html