[英]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.