字典中使用布尔值作为键会导致奇怪的问题吗?

4

我是Python的新手,正在学习字典。我试图往字典中添加随机值和类型,但是以下内容让我感到困惑:

stuff = {True: 1234, 1: 2}
print(stuff[True])
print(len(stuff))

当您执行此代码时,输出结果为:
2
1

这个输出结果是怎么回事?print(stuff[True])不应该输出1234吗?print(len(stuff))不应该输出2吗?我可能漏掉了一些非常显然的东西,请有人能解释一下发生了什么吗?

6
True == 1 的意思是“真”等于“1”; boolint 的子类型。 - Ry-
@Ryan,所以Python实际上将{True: 1234, 1: 2}解释为{1: 1234, 1: 2}?我猜这就解释了len的问题。但是,为什么它选择2而不是1234,特别是因为1234排在第一位呢? - parrot15
3
如果你有多个相同的键,则使用值的最后一个键。您可以将其视为{1: 1234,1:2},但实际上并非如此;True1是不同的,但在==比较中相等,并且字典键基于该相等性进行比较。 - Ry-
2
@Ryan 哦,好的,我明白了,我刚刚调试了我的程序。你是对的,1: 2 覆盖了 1: 1234,所以当解释器读完字典时,它将其读作 stuff = {1: 2}。这解释了两个问题。感谢你的时间。 - parrot15
@parrot15,你找到了你想要的答案吗? - Uri Goren
1个回答

0

尽管Python是动态类型的,但在字典中使用异构键类型被认为是一种不好的做法。

运行{True: 'a', 1: 'b', 1.0: 'c'}实际上会映射到{True: 'c'},

这是因为1==1.01==True,因此它们具有相同的hash

最终结果是使用第一个键,并更新最后一个值。

如果出于某种原因想要分离True1,也可以使用它们的类型作为键(例如(x, type(x)))。

{(True, type(True)): 'a',(1, type(1)): 'b', (1.0, type(1.0)): 'c'}

我建议使用(x, type(x)),这比repr(x)更有效且成本更低。 - Dan D.

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