我是Python的新手,正在学习字典。我试图往字典中添加随机值和类型,但是以下内容让我感到困惑:
stuff = {True: 1234, 1: 2}
print(stuff[True])
print(len(stuff))
当您执行此代码时,输出结果为:
2
1
这个输出结果是怎么回事?
print(stuff[True])
不应该输出1234
吗?print(len(stuff))
不应该输出2
吗?我可能漏掉了一些非常显然的东西,请有人能解释一下发生了什么吗?我是Python的新手,正在学习字典。我试图往字典中添加随机值和类型,但是以下内容让我感到困惑:
stuff = {True: 1234, 1: 2}
print(stuff[True])
print(len(stuff))
2
1
print(stuff[True])
不应该输出1234
吗?print(len(stuff))
不应该输出2
吗?我可能漏掉了一些非常显然的东西,请有人能解释一下发生了什么吗?尽管Python是动态类型的,但在字典中使用异构键类型被认为是一种不好的做法。
运行{True: 'a', 1: 'b', 1.0: 'c'}
实际上会映射到{True: 'c'}
,
这是因为1==1.0
和1==True
,因此它们具有相同的hash
。
最终结果是使用第一个键,并更新最后一个值。
如果出于某种原因想要分离True
和1
,也可以使用它们的类型作为键(例如(x, type(x))
)。
{(True, type(True)): 'a',(1, type(1)): 'b', (1.0, type(1.0)): 'c'}
(x, type(x))
,这比repr(x)
更有效且成本更低。 - Dan D.
True == 1
的意思是“真”等于“1”;bool
是int
的子类型。 - Ry-{True: 1234, 1: 2}
解释为{1: 1234, 1: 2}
?我猜这就解释了len
的问题。但是,为什么它选择2
而不是1234
,特别是因为1234
排在第一位呢? - parrot15{1: 1234,1:2}
,但实际上并非如此;True
和1
是不同的,但在==
比较中相等,并且字典键基于该相等性进行比较。 - Ry-1: 2
覆盖了1: 1234
,所以当解释器读完字典时,它将其读作stuff = {1: 2}
。这解释了两个问题。感谢你的时间。 - parrot15