Python中可散列的数据类型

70 阅读2分钟

在Python中,字典(dict)是一种常用的数据类型,其使用键(key)和值(value)来存储和访问数据。在字典中,键必须是可哈希(hashable)的类型,否则会导致运行时错误。因此,在Python中,有一些可散列的数据类型可以作为字典的键。

可哈希数据类型

下面是Python中可哈希的数据类型:

  • 不可变数据类型:整数(int)、浮点数(float)、复数(complex)、字符串(str)、元组(tuple)、布尔值(bool)等。

  • 数据类型:frozenset等。

需要注意的是,对于可变数据类型,只有在其内容不可变的时候才可以作为字典的键使用。

自定义类

另外,用户自定义的类也可以作为字典的键,但是需要实现__hash__()方法和__eq__()方法。这两个方法是用于判断两个实例是否相同的方法,而哈希方法需要返回一个整数,表示该实例的哈希值。

需要注意的是,实现哈希方法和相等方法时需要满足以下要求:

  1. 如果 a == b,则 hash(a) == hash(b)
  2. 如果 hash(a) == hash(b),则不一定有a == b
  3. 哈希方法和相等方法需要同时实现,否则可能会导致哈希冲突或者字典问题。

示例代码

下面是一个自定义类作为字典键的例子:

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)

persons = {person1: "Alice's data", person2: "Bob's data"}

print(persons[person1]) # 输出 "Alice's data"

在上面的代码中,Person类实现了__hash__()方法和__eq__()方法,并且可以作为字典的键。当我们创建两个Person实例person1和person2,并将它们作为字典的键时,程序不会报错,而是可以正常地存储和访问数据。

总结

Python中可哈希的数据类型包括不可变数据类型和可变数据类型(当其内容不可变时)。此外,用户自定义的类也可以作为字典键,但是需要实现哈希方法和相等方法。在实现哈希方法和相等方法时,需要注意满足相等的条件以及慎重实现哈希值的计算,以避免哈希冲突和字典问题的发生。