[英]Python - Question about initialising lists with [None] versus with just []
[英]Python - question about hashes and `None`
為什么None
哈希到-1042159082
(我發現它等於技嘉中的字節數否定)?
我意識到這並沒有真正影響我的代碼,但我很好奇。
哈希用於字典鍵查找,所以我決定嘗試:
>>> D = {-1042159082: 'Hello', None: 'Hi'}
>>> D[None]
'Hi'
>>> D[-1042159082]
'Hello'
>>>
我理解這是因為Python看到兩個相同的哈希,然后檢查類型以查看它是什么。 那正確嗎?
>>> {False: 'Hello', 0: 'Hi'}
{False: 'Hi'}
>>> {0: 'Hi', False: 'Hello'}
{0: 'Hello'}
這很奇怪。 更重要的是保留第一個鍵,保留第二個鍵。
這是巫術,還是有人能幫助我理解?
您不能也不應該依賴於Python對象的特定哈希值。 它依賴於實現和機器。 在我的機器上:
>>> hash(None)
268532216
就填充dict
對象而言(Python中沒有hash
對象),或許以下內容將有所幫助:
>>> False == 0
True
>>> {0: 'Hello', 0: 'Hi'}
{0: 'Hi'}
>>> {0: 'Hi', 0: 'Hello'}
{0: 'Hello'}
>>> {False: 'Hello', False: 'Hi'}
{False: 'Hi'}
>>> {False: 'Hi', False: 'Hello'}
{False: 'Hello'}
使用dict
構造函數時,您提供兩個key=value
對,但它們都具有相同的鍵(即hashable值),因此,因為dict中的鍵值必須是唯一的,所以最后一個值是保存的值。 換句話說,上面的每個構造函數都創建了一個單項dict:
>>> print {False: 'Hello', 0: 'Hi'}
{False: 'Hi'}
有關詳細信息,請參見此處
不,即使兩個對象恰好具有相同的哈希值,它們仍然不會導致密鑰沖突。 Python檢測到這個並解決它(雖然請不要問我怎么做)。
但是False
與0
相同而True
與1
相同,因此當您在dict構造中使用兩者時,在使用相同的鍵添加另一個項時,您將更新該值。
你如何計算沒有哈希到那個值?
>>> d = {None:'hi'}
>>> d.get(-1042159082)
>>> d.get(None)
'hi'
>>>
>>> hash(None)
268532214
>>>
我不會依賴哈希值的值。
至於使用文字的字典解析,我假設在內部,定義一個'等於'另一個的鍵,將只進行更新而不是直接添加。
>>> class Key(object):
... key = '1'
... def __hash__(self):
... return 1
... def __eq__(self, other):
... return hash(self) == hash(other)
...
>>> class FakeKey(Key):
... key = '2'
...
>>> k = Key()
>>> >>> fk = FakeKey()
>>> d = {k:k,fk:fk}
>>> d
{<__main__.Key object at 0x100489f10>: <__main__.FakeKey object at 0x100489fd0>}
>>> ref = d[k]
>>> ref.key
'2'
>>> d.keys()[0].key
'1'
>>>
出現我是對的(僅出現)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.