"k in d"怎么可能是假的,但是"d.keys()中的k"是真的吗?

Chr*_*Lee 7 python dictionary python-2.x

我有一些python代码抛出KeyError异常.到目前为止,我还没有能够在操作环境之外重现,所以我不能在这里发布一个简化的测试用例.

引发异常的代码正在迭代循环,如下所示:

for k in d.keys():
    if condition:
        del d[k]
Run Code Online (Sandbox Code Playgroud)

del[k]行抛出异常.我try/except在它周围添加了一个条款,并且能够确定它k in d是假的,但是k in d.keys()是真的.

关键d是旧式类实例的绑定方法.

该类实现了__cmp____hash__,因此,这就是我一直专注我的注意.

adw*_*adw 18

k in d.keys()将迭代地为每个键测试相等性,同时k in d使用__hash__,因此您__hash__可能会被破坏(即它为比较相等的对象返回不同的哈希值).


Kat*_*iel 5

感兴趣的简单例子:

>>> count = 0
>>> class BrokenHash(object):
...     def __hash__(self):
...             global count
...             count += 1
...             return count
...
...     def __eq__(self, other):
...             return True
...
>>> foo = BrokenHash()
>>> bar = BrokenHash()
>>> foo is bar
False
>>> foo == bar
True
>>> baz = {bar:1}
>>> foo in baz
False
>>> foo in baz.keys()
True
Run Code Online (Sandbox Code Playgroud)