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

par*_*t15 5 python dictionary

我是 Python 新手,目前正在学习字典。我将随机值和类型放入字典中。这是让我困惑的地方:

stuff = {True: 1234, 1: 2}
print(stuff[True])
print(len(stuff))
Run Code Online (Sandbox Code Playgroud)

当您运行这段代码时,输​​出是:

2
1
Run Code Online (Sandbox Code Playgroud)

这是怎样的输出?不应该print(stuff[True])输出1234print(len(stuff))正在输出吗2?我可能会遗漏一些非常明显的东西,但是有人可以解释一下发生了什么吗?

Uri*_*ren 1

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

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

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

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

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

{(True, type(True)): 'a',(1, type(1)): 'b', (1.0, type(1.0)): 'c'}
Run Code Online (Sandbox Code Playgroud)