簡體   English   中英

即使密鑰存在,Python dict.get(k) 也不返回

[英]Python dict.get(k) returns none even though key exists

可能我對python的字典理解不好。 但這就是問題所在。

字典中是否存在{yolk: shell}對,比如eggs ,但是eggs.get(yolk)可以返回None

因此,在大型代碼中,我對字典進行了多次get操作,並且在某些迭代之后,我觀察到了這種情況。

   >>> for key, value in nodehashes.items():
   ...    print(key, nodehashes.get(key), value)
   ............................
   ...........................
   <Graph.Node object at 0x00000264128C4DA0> 3309678211443697093 3309678211443697093
   <Graph.Node object at 0x00000264128C4DD8> 3554035049990170053 3554035049990170053
   <Graph.Node object at 0x00000264128C4E10> None -7182124040890112571  # Look at this!!
   <Graph.Node object at 0x00000264128C4E48> 3268020121048950213 3268020121048950213
   <Graph.Node object at 0x00000264128C4E80> -1243862058694105659 -1243862058694105659
   ............................
   ............................


乍一看,好像在代碼的某個地方,key被刪除了,但是nodehashes.items()如何返回正確的key-value對呢? 我掃了整個區域,我根本沒有彈出一個項目。 這怎么可能發生?

我知道不發布示例對我來說是錯誤的,但我真的不知道從哪里開始查看代碼,節點在開始時是散列的,並且只能通過get訪問。 令人驚訝的是,即使 PyCharm 的調試器也顯示存在鍵值對。 但是get返回 None。 因此,如果其他人之前遇到過這個問題,我會全神貫注。

def __eq__(self, other): 
    if (self.x == other.x) and (self.y == other.y): 
        return True 
    else: 
        return False 

def __hash__(self): 
    return hash(tuple([self.x, self.y]))

如果您對可變對象有自定義__hash__方法,則可以重現:

class A:
    def __hash__(self):
        return hash(self.a)

>>> a1 = A()
>>> a2 = A()
>>> a1.a = 1
>>> a2.a = 2
>>> d = {a1: 1, a2: 2}
>>> a1.a = 3
>>> d.items()
dict_items([(<__main__.A object at 0x7f1762a8b668>, 1), (<__main__.A object at 0x7f17623d76d8>, 2)])
>>> d.get(a1)
None

您可以看到d.items()仍然可以訪問兩個A對象,但是get找不到它了,因為hash的值發生了變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM