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)
可以禁用吗?这是一个错误吗?
只是提供一些关于arshajii答案的背景知识.
两个布尔值,True和False整数有奇怪的关系.
一方面,它们具有不同的字符串表示形式,并具有单独的标识:
>>> 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类型并不存在."布尔"操作符复制Ç行为,再利用0和1对"假"与"真".
最终Guido意识到这没有多大意义,并添加了我们所知道和喜爱的常数.
但有一个问题.即便如此,已经有很多代码处理像整数这样的布尔值.如果使用"正确"类型启动布尔操作,则所有这些代码都会中断.
所以Guido做出妥协.布尔值有自己的类型,bool并且与整数显示不同.但在算术运算和比较,最明显的是__eq__和__hash__,它们被视为同一个.所以旧代码将继续工作,而新代码仍然可以利用新bool类型.
也许这会在Python 4中发生变化.但是现在,它bool是一个子类int,我们将不得不忍受它.
(在相关的说明中,这是为什么True和False在标题案例中的原因之一,而不是像其他Python关键字一样的小写.)
这是因为这些值被认为是平等的:
>>> 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)
因此,从字典的角度来看,True和1是无法区分的是False和0.
没有办法"禁用"这个 - 你不应该在dict中使用非同质键开始.
在这种特殊情况下的一个潜在的解决方法是预留的特殊INT值True和False比其他1和0分别,(假设你需要1并0作为独立的键).例如,您可以-1代表True并-2代表False.