Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典强制是有意还是无意?_Python_Python 3.x_Dictionary - Fatal编程技术网

Python 字典强制是有意还是无意?

Python 字典强制是有意还是无意?,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,如果我写: d = { 0:'a', 1:'b' } d[False] = 'c' d[True] = 'd' print(d) 我得到: { 0:'c', 1:'d' } 为什么要强迫他们加入ints?相反,它做同样的事情 d = {False:'a', True:'b'} d[0] = 'c' d[1] = 'd' print(d) 输出为: {False:'c', True: 'd'} 这可以被禁用吗?这是一个bug吗?只是提供一些关于阿尔沙吉答案的背景资料 这两个布尔值,True

如果我写:

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

{ 0:'c', 1:'d' }
为什么要强迫他们加入ints?相反,它做同样的事情

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

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

这可以被禁用吗?这是一个bug吗?

只是提供一些关于阿尔沙吉答案的背景资料

这两个布尔值,
True
False
与整数有着奇怪的关系

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

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

>>> True is 1
False
另一方面,它们在比较和算术中表现为整数:

>>> True == 1
True
>>> True + 1
2
这种行为的原因是兼容性。很久以前,
bool
类型不存在。“Boolean”运算符复制了C行为,重用
0
1
表示“false”和“true”

最终圭多意识到了这一点,并添加了我们所知道和喜爱的常数

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

所以圭多做出了妥协。布尔型有自己的类型,
bool
,显示方式与整数不同。但在算术运算和比较中,最明显的是
\uuuuuueq\uuuuuu
\uuuuuu hash\uuuuuuu
,它们被视为一个整体。因此,旧代码将继续工作,而新代码仍然可以利用新的
bool
类型

也许在Python4中会有所改变。但是现在,
bool
int
的一个子类,我们不得不接受它


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

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

>>> True == 1
True
>>> 
>>> False == 0
True
和具有相同的哈希值:

>>> hash(True), hash(1)
(1, 1)
>>> 
>>> hash(False), hash(0)
(0, 0)
因此,从词典的角度来看,
True
1
False
0
是无法区分的

没有办法“禁用”它——首先,不应该在dict中使用非同质键


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

bool
int
的一个子类,其表示为“False”或“True”,但其值为0或1。

请注意
isinstance(True,int)
返回
True
。如果我没记错的话,布尔只是
int
的特殊子类。是的,
True.\uu class\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
.Related:@Ashwini Chaudhari:关于真与假的定义,请看这里:@Humbalan我想我很清楚它们的意思。它们不是别名……如果它们,
False为0
则为
True
。我理解你的意思,但只是为了清楚起见…编辑和修复。这就是在你上班之前发生的事情;)不仅仅是值,它还具有相同的哈希函数。