Python 用户自定义的类为什么是不可哈希的
在本文中,我们将介绍为什么用户自定义的类在Python中是不可哈希的,并提供相应的示例来说明。
阅读更多:Python 教程
什么是哈希?
在深入了解用户自定义的类为什么是不可哈希之前,让我们首先回顾一下哈希的概念。哈希是一种将任意长度的数据映射成固定长度值的过程。哈希函数可以将输入映射成唯一的输出,这样我们就可以根据这个输出来判断输入是否相同。哈希函数在散列表和哈希表等数据结构中被广泛使用。
哈希与不可变性
在Python中,可哈希的对象必须满足一个条件:它们必须是不可变的。不可变意味着一旦对象被创建后,它的状态就不能被改变。例如,数字、字符串和元组等内置类型都是不可变的,因此它们都是可哈希的。
用户自定义的类是可变的
相反,用户自定义的类是可变的。这意味着我们可以在创建后修改类的属性。考虑下面这个示例:
class Person:
def __init__(self, name):
self.name = name
person = Person("Alice")
person.name = "Bob"
在上面的示例中,我们创建了一个名为Person的类,并在实例化后更改了其name属性。这就是用户自定义的类是可变的一个简单示例。
可变性导致不可哈希性
由于用户自定义的类是可变的,它们无法用作哈希表的键。哈希表在实现中使用哈希函数来确定键的位置,因此需要键是不可变的。如果可变对象被允许用作键,那么当键的状态发生变化时,它将无法正常在哈希表中进行查找。为了避免这种情况,Python决定让用户自定义的类是不可哈希的。
示例
让我们通过一个示例来进一步说明用户自定义的类为什么是不可哈希的。考虑下面这个简单的类:
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
s1 = Student("Alice", 90)
s2 = Student("Bob", 80)
现在我们尝试将这些学生对象作为字典的键:
students = {s1: "good", s2: "average"}
这将导致TypeError:unhashable type: ‘Student’,因为Student类是不可哈希的。
总结
在本文中,我们介绍了为什么用户自定义的类在Python中是不可哈希的。由于用户自定义的类是可变的,它们无法用作哈希表的键。为了避免可变对象在哈希表中的问题,Python决定用户自定义的类是不可哈希的。希望本文能帮助你理解Python中的哈希概念和用户自定义类的不可哈希性质。