首页 > 解决方案 > 为什么自定义对象在 python 中是可散列的(并且可以在 dict 中使用)?

问题描述

新手问题:为了将对象用作其中的键,dict它需要是可散列的。很明显,不可变类型可以用作键,而可变类型不能。但是,如果我定义一个可变的类,显然它仍然可以用作键。在下面的代码中my_obj是对包含类型对象的内存槽的引用RandomObject。该内存插槽包含x对 25 的引用 ( ),但此引用可以更改为指向其他任何内容。这让我很困惑,为什么它会起作用?此外,my_obj可以引用RandomObject. 如果散列发生在实际对象(而不是引用的内存地址)上,这将如何工作?

class RandomObject:
    def __init__(self, x):
        self._x = x

d = {"hi": 1, "bye": 2}
my_obj = RandomObject(25)
d[my_obj] = 3
print(d)
#{'hi': 1, 'bye': 2, <__main__.RandomObject object at 0x0000000005B75D30>: 3}

标签: pythonpython-3.x

解决方案


您的类继承object.__eq__and object.__hash__,它按身份工作。散列并不直接关心可变性。它只关心影响==比较的可变性。当==是通过身份时,没有突变会影响==比较。


推荐阅读