布尔键与字典中的其他数据类型

时间:2017-05-25 16:45:47

标签: python dictionary

我正在浏览一些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'}

只有在字典中包含布尔值时才会发生吗?

3 个答案:

答案 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的实际搜索过程如下:

  1. 获取提供的密钥hash(key)
  2. 的哈希值
  3. slot值下找到相应的hash
  4. 遍历slot以查找满足tkey的目标密钥(将其命名为tkey == key),然后返回value的{​​{1}}。
  5. 因此,在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

    为什么1hash不能同时存在于一个字典

    在这个问题(或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中的任何类型的哈希存储中都不能同时拥有1True(没有实现自己的哈希函数)。