为什么为字典的键“True”赋值会覆盖同一字典中键“1”的值?
Why does assinging a value to the key `True` of an dictionary overwrite the value of the key `1` in the same dictionary?
对于这个简单的字典 -
键 1 和值“apple”始终打印为“1: False”
是否有我忽略的原因?
$猫dict.py
pairs = {1: "apple",
"orange": [2, 3, 4],
True: False,
None: "True",
}
print(pairs)
*$python3.8dict.py
{1: False, 'orange': [2, 3, 4], None: 'True'}
谢谢
Python 中的 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'}
虽然这解释了行为,但我同意它可能有些混乱。因此我建议不要使用不同类型的字典键,这样你就不会 运行 遇到这种情况。
对于这个简单的字典 -
键 1 和值“apple”始终打印为“1: False”
是否有我忽略的原因?
$猫dict.py
pairs = {1: "apple",
"orange": [2, 3, 4],
True: False,
None: "True",
}
print(pairs)
*$python3.8dict.py
{1: False, 'orange': [2, 3, 4], None: 'True'}
谢谢
Python 中的 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'}
虽然这解释了行为,但我同意它可能有些混乱。因此我建议不要使用不同类型的字典键,这样你就不会 运行 遇到这种情况。