python - 为什么自定义对象在 python 中是可哈希的(并且可以在 dict 中使用)?

标签 python python-3.x

新手问题:为了将对象用作 dict 中的键,它需要是可散列的。很明显,不可变类型可以用作键,而可变类型不能。但是,如果我定义一个可变的类,显然它仍然可以用作键。在下面的代码中,my_obj 是对包含 RandomObject 类型对象的内存槽的引用。该内存槽包含对 25 的引用 (x),但可以将此引用更改为指向其他任何内容。这让我感到困惑,为什么它有效?此外,可以使 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}

最佳答案

您的类继承了 object.__eq__object.__hash__,它们按标识工作。散列不直接关心可变性;它只关心影响 == 比较的可变性。当 == 是同一性时,没有变化会影响 == 比较。

关于python - 为什么自定义对象在 python 中是可哈希的(并且可以在 dict 中使用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032956/

相关文章:

python-3.x - 为什么我的程序在输入 "q"后没有退出?

python - 我在运行一个简单的 pyttsx3 示例时遇到错误

javascript - 将内容推送到浏览器...更改 DOM?

python - 使用 Python setuptools 将 Cython 编译的 pyd 文件放入其原始文件夹中?

python - 同一引用中的成员运算符

android - 无法在 Kivy 中为动画选择 id

python - 我在将 unicode 转换为字符串时遇到困难

python - “float/str/int”对象不可调用错误

python - 防止更改应用于原始数据框的好方法是什么?

python - 为什么pytorch模型在设置eval()后表现不佳?