Python字典如何违反Python规则

7
当我执行以下操作时:
>>> d={True:'yes',1:'no',1.0:'maybe'}
>>> d

我收到的输出是:
>>> {True:'maybe'}

不仅我的一些键被删除了,而且它们所持有的值也发生了改变。

为什么True比其他bool键具有优先级?


2
有趣与否,这是一个重复的内容。 - cs95
为什么我的评论被删除了? - sureshvv
这里详细解释了 - https://dbader.org/blog/python-mystery-dict-expression - Jaspreet Jolly
1个回答

13
三个键True、1和1.0彼此相等,并且都具有相同的哈希值(在Python REPL中尝试hash(True)hash(1)hash(1.0)),因此它们都对应于字典中的同一插槽。最后设置的值胜出——在这种情况下是'maybe'。
请注意,如果键不相等,则即使它们哈希到字典中的同一插槽,也会分别存储。

1
@sureshvv:那会增加开销,并且破坏了在“dict”之外看到的等式关系。为“dict”制定一个特殊情况会令人困惑。如果OP确实需要,可以始终使用带有元组键的“dict”,其中第一个元素是值,第二个元素是类型。 - ShadowRanger
1
我认为一般情况下这是不可取的。 - babbageclunk
3
相等的值总是具有相同的哈希值,这些值相等比它们的哈希值相等更重要。这里出现令人惊讶的行为的根本原因是 True == 1 - jwilner
3
基本上这段代码在执行 d = {}; d[True] = 'yes'; d[1] = 'no'; d[1.0] = 'maybe'。它会保留第一个键(因为它们都相等),但总是进行赋值操作,所以你会得到最后一个值。 - babbageclunk
1
@sureshvv 我认为问题在于让1 != 1.0 在其他方面也会非常奇怪和令人惊讶。True == 1 的事实很不幸,但要修复它将非常困难,需要进行重大的破坏性变更(可能比2到3中的str/bytes更糟糕)。 - babbageclunk
显示剩余11条评论

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