字典强制有意或无意?

tem*_*ame 9 python dictionary python-3.x

如果我写:

d = { 0:'a', 1:'b' }
d[False] = 'c'
d[True] = 'd'
print(d)
Run Code Online (Sandbox Code Playgroud)

我明白了:

{ 0:'c', 1:'d' }
Run Code Online (Sandbox Code Playgroud)

为什么要强迫他们进入整体?它反过来做同样的事情.

d = {False:'a', True:'b'}
d[0] = 'c'
d[1] = 'd'
print(d)
Run Code Online (Sandbox Code Playgroud)

输出是:

{False:'c', True: 'd'}
Run Code Online (Sandbox Code Playgroud)

可以禁用吗?这是一个错误吗?

Lam*_*iry 6

只是提供一些关于arshajii答案的背景知识.

两个布尔值,TrueFalse整数有奇怪的关系.

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

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

>>> True is 1
False
Run Code Online (Sandbox Code Playgroud)

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

>>> True == 1
True
>>> True + 1
2
Run Code Online (Sandbox Code Playgroud)

这种行为的原因是兼容性.很久以前,这种bool类型并不存在."布尔"操作符复制Ç行为,再利用01对"假"与"真".

最终Guido意识到这没有多大意义,并添加了我们所知道和喜爱的常数.

但有一个问题.即便如此,已经有很多代码处理像整数这样的布尔值.如果使用"正确"类型启动布尔操作,则所有这些代码都会中断.

所以Guido做出妥协.布尔值有自己的类型,bool并且与整数显示不同.但在算术运算和比较,最明显的是__eq____hash__,它们被视为同一个.所以旧代码将继续工作,而新代码仍然可以利用新bool类型.

也许这会在Python 4中发生变化.但是现在,它bool是一个子类int,我们将不得不忍受它.

(在相关的说明中,这是为什么TrueFalse在标题案例中的原因之一,而不是像其他Python关键字一样的小写.)


ars*_*jii 6

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

>>> True == 1
True
>>> 
>>> False == 0
True
Run Code Online (Sandbox Code Playgroud)

并具有相同的哈希值:

>>> hash(True), hash(1)
(1, 1)
>>> 
>>> hash(False), hash(0)
(0, 0)
Run Code Online (Sandbox Code Playgroud)

因此,从字典的角度来看,True1是无法区分的是False0.

没有办法"禁用"这个 - 你不应该在dict中使用非同质键开始.

在这种特殊情况下的一个潜在的解决方法是预留的特殊INT值TrueFalse比其他10分别,(假设你需要10作为独立的键).例如,您可以-1代表True-2代表False.