Python:为什么我可以将可变对象放入dict或set中?

Yan*_*eng 7 python hash immutability

给出以下示例,

class A(object):
    pass
a = A()
a.x = 1
Run Code Online (Sandbox Code Playgroud)

显然是一个可变的,然后我把一个放入一套,

set([a])
Run Code Online (Sandbox Code Playgroud)

它成功了.为什么我可以将像"a"这样的可变对象放入set/dict中?不应该设置/ dict只允许不可变对象,以便他们可以识别对象并避免重复?

Mar*_*ers 13

Python不测试可变对象,它测试可清除对象.

默认情况下,自定义类实例是可清除的.这很好,因为__eq__这些类的默认实现只测试实例身份,而哈希是基于相同的信息.

换句话说,改变实例属性的状态并不重要,因为实例的标识无论如何都是不可变的.

只要你实现一个很快__hash____eq__方法需要实例状态考虑,你可能会遇到麻烦,应该停止突变所状态.只有这样,自定义类实例才不再适合存储在字典或集合中.