1 回答
TA贡献1828条经验 获得超3个赞
Python 中的类型是where equals the number和equals the numberbool的子类型:intTrue1False0
>>> 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'}
虽然这解释了这种行为,但我确实同意它可能有点令人困惑。因此,我建议不要使用不同类型的字典键,以免遇到这种情况。
添加回答
举报