我可以使用可变对象作为python中的字典键。这是不允许的吗?

class A(object):

x = 4

i = A()

d = {}

d[i] = 2

print d

i.x = 10

print d

我以为只有不可变的对象才可以是字典键,但是上面的对象是可变的。

回答:

具有方法的任何对象都可以是字典键。对于您编写的类,此方法默认返回基于id(self)的值,并且如果相等性不是由这些类的标识决定的,则将它们用作键可能会让您感到惊讶:

>>> class A(object):

... def __eq__(self, other):

... return True

...

>>> one, two = A(), A()

>>> d = {one: "one"}

>>> one == two

True

>>> d[one]

'one'

>>> d[two]

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

KeyError: <__main__.A object at 0xb718836c>

>>> hash(set()) # sets cannot be dict keys

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: unhashable type: 'set'

在2.6版中进行了更改:__hash__现在可以设置为None,以将类实例明确标记为不可哈希。[

]

class Unhashable(object):

__hash__ = None

以上是 我可以使用可变对象作为python中的字典键。这是不允许的吗? 的全部内容, 来源链接: utcz.com/qa/406461.html

回到顶部