为什么自定义类的对象可以作为字典的键,而Python中的列表却不能?

问题描述 投票:0回答:1
class MyClassA:
    def __init__(self, value=0):
        self.value = value

class MyClassB:
    def __init__(self, value=0, list_=[]):
        self.value = value
        self.list = list_
        
a = MyClassA()
b = MyClassB()
c = []

dict_ = {}
dict_[a] = 1 # No error
dict_[b] = 1 # No error
dict_[c] = 1 # TypeError: unhashable type: 'list'
  • MyClassA / MyClassB 的对象是不可变的吗?
  • 列表也是一种对象。那么为什么它变得不可散列呢? 我对此很困惑。
python dictionary hash hashmap
1个回答
0
投票

dict 键需要是 hashable,这需要实现

__hash__
方法。

默认情况下,对象实现基于 id 的哈希函数。不过,哈希对于可变对象没有什么意义,因此它从该类型的内置类的实现中删除。您可以通过将 None 分配给方法来对自定义类执行相同的操作:

class MyClassA:
    def __init__(self, value=0):
        self.value = value
    __hash__ = None
dict_[MyClassA()] = 1 # TypeError: unhashable type: 'MyClassA'

关于问题 1 - 不,您可以更改

A.value
B.value
B.list
的值,因此它们不是一成不变的。

旁注:

  1. 您可能不应该将列表设置为参数的默认值 - “最不惊讶”和可变默认参数
  2. 不要使用内置名称来调用变量,例如
    self.list
© www.soinside.com 2019 - 2024. All rights reserved.