hashmap自定义对象key 注意什么
时间: 2023-11-11 15:05:37 浏览: 75
将自定义对象作为哈希表的键时,需要注意以下几点:
1. 重写 `__hash__` 方法:哈希表以哈希值作为键值对的索引,因此需要重写 `__hash__` 方法来计算哈希值。如果不重写 `__hash__` 方法,则默认使用对象的内存地址作为哈希值,这样无法保证不同对象的哈希值不同,会导致哈希冲突。
2. 重写 `__eq__` 方法:哈希表通过哈希值来判断键值对是否相等,如果哈希值相等,还需要通过 `__eq__` 方法来判断键值对是否相等。如果不重写 `__eq__` 方法,则默认使用 `is` 运算符来判断是否相等,这样会导致相同内容的不同对象被认为是不同的键。
3. 不可变性:作为哈希表的键,对象必须是不可变的,否则在修改对象后哈希值会发生变化,导致键值对无法被正确找到。因此,自定义对象需要保证其属性值不可变,或者只使用不可变类型的属性作为键。
4. 散列均匀性:哈希表的效率与散列均匀性有关,因此需要保证哈希函数能够均匀地分布键值对。如果哈希函数不均匀,会导致哈希冲突增多,降低哈希表的效率。
下面是一个示例,演示如何使用自定义对象作为哈希表的键:
```python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __hash__(self):
return hash((self.name, self.age))
def __eq__(self, other):
return self.name == other.name and self.age == other.age
person1 = Person('Alice', 25)
person2 = Person('Bob', 30)
map = {}
map[person1] = 'Alice'
map[person2] = 'Bob'
print(map[person1]) # 输出 'Alice'
print(map[person2]) # 输出 'Bob'
```
在这个示例中,我们重写了 `__hash__` 和 `__eq__` 方法,以确保自定义对象作为哈希表的键时能够正常工作。同时,由于 `name` 和 `age` 属性都是不可变的,因此可以保证对象不可变。
阅读全文