根据我的理解,Python用户定义的类实例在默认情况下是不可变的。不可变对象不会改变它们的散列值,它们可以用作字典键和元素。Python 3用户定义的不可变类对象
我有下面的代码片段。
class Person(object):
def __init__(self, name, age):
self.name=name
self.age=age
现在,我将实例化Person类并创建一个对象并打印它的散列值。
jane = Person('Jane', 29)
print(jane.__hash__())
-9223371933914849101
现在,我将改变jane对象并打印它的散列值。
jane.age = 33
print(jane.__hash__())
-9223371933914849101
我的问题是,即使jane对象是可变的,为什么它的哈希值没有改变?
另外,我可以使用可变jane对象作为dict键和set元素。
“按我的理解,Python的用户定义的类实例是默认不可改变” - 相反,用户定义类的实例默认是可变的,并且试图使它们不可变是相当混乱的。 – user2357112
@ user2357112可以猴子补丁类,所以我很确定类实例是可变的。请参阅http://stackoverflow.com/questions/5626193/what-is-a-monkey-patch – Mai
@Mai:当然,你可以猴子补丁类,但是否这种计数作为突变他们的实例是争论。在任何情况下,您都可以通过使用Cython编写它们或直接使用C API来获得大多数不可猴子可修补的类,并且即使没有通过从内置类继承来将C带入图片也可以获得大多数不可变的实例使用不可变实例并设置__slots__ =()来禁用实例__dict__'的创建。 – user2357112