对于这个简单的字典 -
键1和值“apple”总是打印为“1:False”。
我是否忽略了一些原因?
$ cat dict.py
pairs = {1: "apple",
"orange": [2, 3, 4],
True: False,
None: "True",
}
print(pairs)
*$ python3.8 dict.py
{1: False, 'orange': [2, 3, 4], None: 'True'}
谢谢
对于这个简单的字典 -
键1和值“apple”总是打印为“1:False”。
我是否忽略了一些原因?
$ cat dict.py
pairs = {1: "apple",
"orange": [2, 3, 4],
True: False,
None: "True",
}
print(pairs)
*$ python3.8 dict.py
{1: False, 'orange': [2, 3, 4], None: 'True'}
谢谢
bool
类型是int
的子类型,其中True
等于数字1
,而False
等于数字0
:>>> True == 1
True
>>> False == 0
True
>>> hash(True)
1
>>> hash(1)
1
>>> hash(False)
0
>>> hash(0)
0
现在,由于字典键是基于哈希和对象相等性的(首先使用哈希相等性快速查找可能相等的键,然后通过相等性比较它们),导致两个值产生相同的哈希并且相等将会在字典的相同“位置”中。
如果您创建具有此行为的自定义类型,也可以看到这一点:
>>> class CustomTrue:
def __hash__(self):
return 1
def __eq__(self, other):
return other == 1
>>> pairs = {
1: "apple",
"orange": [2, 3, 4],
True: False,
None: "True",
}
>>> pairs[CustomTrue()] = 'CustomTrue overwrites the value'
>>> pairs
{1: 'CustomTrue overwrites the value', 'orange': [2, 3, 4], None: 'True'}
虽然这解释了这种行为,但我同意它可能有点令人困惑。因此,我建议不要使用不同类型的字典键,这样就不会遇到这种情况。
p = {},p [1] =“apple”,p [True] = False,print(p)
相同的操作会用False
覆盖apple
。 - Patrick Artnerhash(1) == hash(True)
但我同意这种行为并不直观。 - snakecharmerb