新手问题:为了将对象用作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}
答案 0 :(得分:6)
您的班级继承了object.__eq__
和object.__hash__
,它们按身份运作。哈希并不直接关注可变性;它只关心影响==
比较的可变性。如果==
是同一身份,则任何突变都不会影响==
比较。