密钥不是python字典的唯一!

use*_*205 3 python dictionary hashtable

这是一个愚蠢的新手问题对于python字典q len(set(q.keys())) != len(q.keys()).这甚至可能吗?

Gle*_*ard 16

如果违反要求dict并更改其哈希值,就会发生这种情况.

当在a中使用对象时dict,其哈希值不得更改,并且其与其他对象的相等性不得更改.其他属性可能会发生变化,只要它们不影响它对dict的显示方式.

(但这并不意味着哈希值是绝不允许改变.这是一个常见的误解.哈希值本身可能改变.这只是dict其中需要重点哈希是不可改变的,而不是__hash__自己.)

下面的代码将一个对象添加到dict,然后从dict下面更改其散列. q[a] = 2然后a在dict中添加一个新键,即使它已经存在; 由于哈希值已更改,因此dict未找到旧值.这再现了你所看到的特殊性.

class Test(object):
    def __init__(self, h):
        self.h = h
    def __hash__(self):
        return self.h

a = Test(1)
q = {}
q[a] = 1
a.h = 2
q[a] = 2

print q

# True:
print len(set(q.keys())) != len(q.keys())
Run Code Online (Sandbox Code Playgroud)