字典胁迫是有意还是无意?

2024-05-12 20:10:19 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我写下:

d = { 0:'a', 1:'b' }
d[False] = 'c'
d[True] = 'd'
print(d)

我得到:

^{pr2}$

为什么要强迫他们进入INT?它反过来做同样的事情。在

d = {False:'a', True:'b'}
d[0] = 'c'
d[1] = 'd'
print(d)

输出为:

{False:'c', True: 'd'}

可以禁用吗?是虫子吗?在


Tags: falsetrue事情intprint虫子pr2
3条回答

因为这些值被认为是相等的:

>>> True == 1
True
>>> 
>>> False == 0
True

并且具有相同的哈希值:

^{pr2}$

因此,从字典的角度来看,True和{}与{}和{}是无法区分的。在

没有办法“禁用”这个你不应该在dict中使用非同质键。在

在这种特定情况下,一个潜在的解决方法是为True和{}保留特殊的int值,而不是分别为1和{}(假设您需要1和{}作为独立键)。例如,-1代表True,而{}代表False。在

只是提供一些关于阿尔沙吉回答的背景。在

两个布尔值TrueFalse与整数有着奇怪的关系。在

一方面,它们具有不同的字符串表示形式,并且具有不同的标识:

>>> print(True)
True
>>> print(1)
1

>>> True is 1
False

另一方面,它们在比较和算术下表现为整数:

^{pr2}$

这种行为的原因是兼容性。很久以前,bool类型不存在。”Boolean“运算符复制了C行为,将0和{}重用为“false”和“true”。在

最终Guido实现了this didn't make much sense,并添加了我们知道和喜爱的常量。在

但是有个问题。即使在那时,已经有很多代码将布尔值当作整数来处理。如果布尔操作开始使用“正确”类型,所有这些代码都将中断。在

所以圭多做出了妥协。布尔值有自己的类型bool,并且与整数的显示方式不同。但是在算术运算和比较中,尤其是__eq__和{},它们被视为一个整体。所以旧代码将继续工作,而新代码仍然可以利用新的bool类型。在

也许在python4中会发生变化。但是现在,boolint的一个子类,我们不得不接受它。在

(另一方面,这就是为什么True和{}是以标题大小写的,而不是像其他Python关键字那样使用小写的原因之一。)

boolint的一个子类,其表示为“False”或“True”,但其为0或1。在

相关问题 更多 >