python - 为什么自定义对象在 python 中是可散列的(并且可以在 dict 中使用)?
问题描述
新手问题:为了将对象用作其中的键,dict
它需要是可散列的。很明显,不可变类型可以用作键,而可变类型不能。但是,如果我定义一个可变的类,显然它仍然可以用作键。在下面的代码中my_obj
是对包含类型对象的内存槽的引用RandomObject
。该内存插槽包含x
对 25 的引用 ( ),但此引用可以更改为指向其他任何内容。这让我很困惑,为什么它会起作用?此外,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__
and object.__hash__
,它按身份工作。散列并不直接关心可变性。它只关心影响==
比较的可变性。当==
是通过身份时,没有突变会影响==
比较。
推荐阅读
- django-rest-framework - Remove authentication and permission classes only on one action
- javascript - 无法设置图像资产为空的属性“src”
- javascript - 我不确定这个项目发生了什么,它在本地工作,但在服务器上有问题
- .net - React SPA 在刷新时找不到页面 - 从导航栏中选择时加载正常
- mysql - 在另一个帐户下的mysql中获取正确的当前用户
- javascript - 如何使用 JavaScript 将视频文件压缩到特定大小?
- c# - 使用 c# 在 Oracle 表中为时间戳列添加日期
- python-3.x - tkinter 和 matplotlib 图中的多普勒效应
- laravel - Vue路由器导航保护防止url被更改
- php - 如何使用数组索引访问 php 中的 Json 信息