给定以下示例,
class A(object):
pass
a = A()
a.x = 1
很明显a是可变的,然后我把a放到set里,
set([a])
成功了。为什么我可以将像“a”这样的可变对象放入集合/字典中? set/dict 不应该只允许不可变对象(immutable对象)以便它们可以识别对象并避免重复吗?
最佳答案
Python 不测试可变 对象,它测试可散列 对象。
自定义类实例默认是可哈希的。这很好,因为此类类的默认 __eq__
实现仅测试实例 identity 并且散列基于相同的信息。
换句话说,改变实例属性的状态并不重要,因为实例的身份无论如何都是不可变的。
一旦您实现了将实例状态考虑在内的 __hash__
和 __eq__
方法,您可能会遇到麻烦,应该停止改变该状态。只有这样,自定义类实例才不再适合存储在字典或集合中。
关于Python:为什么我可以将可变对象放在字典或集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31340756/