在Python中,字典的键(key)必须是可哈希的,这意味着键对象必须满足以下条件:
不可变性:
键对象不能是可变的,因为可变对象的内容可以在创建后改变,这会导致其哈希值改变,从而破坏字典的结构。
可散列性:
键对象必须有一个`__hash__`方法,该方法返回一个整数,表示对象的哈希值。
一致性:
如果两个对象相等(使用`==`运算符比较),那么它们的哈希值必须相同。
根据这些条件,以下类型的对象可以作为Python字典的键:
不可变类型:如整数、浮点数、字符串、元组(元组内的元素也必须是不可变的)。
自定义不可变类型:只要自定义类型是不可变的,并且实现了`__hash__`方法,也可以作为字典的键。
```python
使用不可变类型作为键
d1 = {1: "one", "two": 2, (3, 4): "three_four"}
自定义不可变类型作为键
class ImmutableKey:
def __init__(self, value):
self.value = value
def __hash__(self):
return hash(self.value)
def __eq__(self, other):
if isinstance(other, ImmutableKey):
return self.value == other.value
return False
d2 = {ImmutableKey(1): "one", ImmutableKey("two"): 2}
可变类型:如列表、字典、集合,因为它们的内容可以在创建后改变。
没有`__hash__`方法的对象:如果一个对象没有实现`__hash__`方法,它就不能作为字典的键。
需要注意的是,列表和字典作为键时,它们自身是不可变的,但列表是可变的,所以列表不能作为字典的键。而元组是不可变的,所以可以作为字典的键。