我正在浏览一些python字典链接并找到了这个。
我似乎无法理解下面发生的事情。
dict1 = {1:'1',2:'2'}
print dict1
输出
{1:'1',2:'2'}
但是如果我在字典中添加一个布尔键,它会给出一些奇怪的东西。
dict2 = {True:'yes',1:'1',2:'2'}
print dict2
输出
{True:'1',2:'2'}
只有在字典中包含布尔值时才会发生吗?
答案 0 :(得分:5)
问题是DateTime.UtcNow.Ticks
是一个内置枚举,其值为True
。因此,哈希函数将1
视为另一个True
,并且......正如您所见,两者在重新映射时会感到困惑。是的,有一些严格的规则可以描述Python如何解释这些,但你可能不关心在这个级别上过去False = 0和True = 1的任何事情。
您看到的标签(例如,True与1)在第一个参考处设置。例如:
1
注意这是如何工作的:每个字典条目显示每个给定值(0 / False和1 / True)的第一个标签。与任何赋值一样,显示的值是最后一个。
答案 1 :(得分:2)
在Python中,dict的keys
存储为hash-slot
对,其中slot
由特定key-value
下的hash
对组成。因此,在{d}中通过value
获取key
的实际搜索过程如下:
hash(key)
,slot
值下找到相应的hash
slot
以查找满足tkey
的目标密钥(将其命名为tkey == key
),然后返回value
的{{1}}。 因此,在Python中,如果key
keys
不相同,则相同hashes
可能会有不同的值,而hashes
keys
可能会有不同的值hash
不一样。 __hash__
值由key
方法计算,__eq__
s是否相同,由__cmp__
方法(或class A:
def __hash__(self):
return 1
def __eq__(self, other):
return False
)控制。
例如,
A
现在,1
的所有实例都具有相同的哈希值a1 = A()
a2 = A()
print(hash(a1) == hash(a2)) # True
print(a1 == a2) # False
print(a1 == a1) # False
,但所有实例都不同(包括与自身进行比较):
keys
让我们看看dict
中作为b = {
a1: 1,
a2: 2,
}
print(b)
# {<__main__.A object at 0x000002DDCB505DD8>: 1,
# <__main__.A object at 0x000002DDCB505D30>: 2}
时的身份:
True
1
和hash
不能同时存在于一个字典在这个问题(或Python中的大多数情况)中,等效key
表示等效print(hash(True) == hash(1)) # True
print(True == 1) # True
。
hash slot
结果(或者说,这种相等机制的原因)是每个key-value
只有一个keys
对(因为class exint(int):
def __init__(self, val):
self.val = val
def __eq__(self, other):
return False
def __hash__(self):
return int.__hash__(self.val)
a = exint(1)
print(a) # 1
b = {
a: 1,
True: 2,
}
print(b) # {1: 1, True: 2}
是相等的)。这使得搜索值非常快,因为不需要在插槽上进行迭代。不过,您可以在自己的代码中更改此 equality ,以在dict中实现多个相同的哈希键。
If Textbox1.text = nothing then
Textbox1.text = "0"
End if
答案 2 :(得分:0)
Python dict
是一个哈希映射 - 它通过哈希函数对其键进行索引,以便在内存中快速查找。由于hash(1) is hash(True)
的评估是True
,因此Python认为两者都是相同的密钥。因此,在Python中的任何类型的哈希存储中都不能同时拥有1
和True
(没有实现自己的哈希函数)。