Python:为什么我可以将可变对象放在字典或集合中?

标签 python hash immutability

给定以下示例,

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/

相关文章:

java - 在 Java 9 中是否存在用于将类标记为单例或不可变的注释?

c# - 我是否需要锁定以 ReadOnlyCollection 作为参数的并发方法?

ruby - 将两个散列与一个公共(public) key 结合起来

python - 可变的用户定义类型和集

python - 从父目录构建 Dockerfile

python - 从 Dask DataFrame 中删除列数不相等的行

java - hash()%n 和 n%hash() 有什么区别

constructor - 不可变(数据)类上的多个构造函数

python - 过滤长时间序列Python的最有效方法

python - 有关系的删除行为