当字典键相同时,为什么Python仅保留最后一个键值对?

亚历克斯

假设我创建了一个字典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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在保留其键值不变的情况下将一个python字典附加到另一个字典?

Python字典中的最后一个键

能够仅访问Python Unicode字典中列表的最后一个元素

Python:仅保留最后n个插入键的字典

原则仅保留CollectionType中的最后一个实体

当多个线程正在写入一个LinkedHashMap时,仅保留一个键值对,该键值对由最后一个线程添加

删除相同的列,同时每组保留一个

For循环避免在字典中写入最后一个键

将具有相同键值对的多个字典合并到一个字典python

字典仅返回for循环内的最后一个键值对

当仅与一个formControl进行交互时,为什么同时触发所有valueChanges?

当键对相同时,将值从一个嵌套字典复制到另一个嵌套字典

为什么关联容器中的end()元素与最后一个元素打印相同的值?

如何根据python中另一个字典键的匹配来修改字典中的键值列表?

Python:根据一个相同的键组合所有dict键值

为什么python打印最后一个键

如何使用URLSearchParams删除具有相同键的多个键值对中的仅一个?

为什么Python中字典的键可以相同?

为什么双“&”链接条件在最后一个条件中同时在后台运行?

当两个键的值相同时,从python字典中删除一个项目

为什么仅为按下的最后一个键生成键事件?

json转换器仅使用最后一个字典的最后一个键值,而不是全部

为什么我的数组列表没有保留最后一个答案?

如果 JavaScript 对象有相同的键不同的值,只获取重复键的最后一个键值

为什么忽略一个键并且为字典的每个项目分配相同的值?

如何从python字典中的另一个键值对中弹出一个键值对

如何在Python中用一个键分隔字典同时解析数据?

为什么我的if语句函数只将我的打印消息分配给python字典中的最后一个键值

为什么这会一直返回字典的最后一个值?