📜  Python中“__eq__”与“is”与“==”的区别(1)

📅  最后修改于: 2023-12-03 15:34:21.606000             🧑  作者: Mango

Python中“eq”与“is”与“==”的区别

在Python中,“eq”、“is”和“==”都有着不同的用途。在本篇文章中,我们将会详细地介绍它们之间的区别。

eq

eq”是Python内置的一个特殊方法,它用来比较两个对象是否相等。当我们使用“==”符号时,Python会自动调用“eq”方法来比较两个对象是否相等。但是,如果我们自己定义了一个类,那么默认情况下,它的“eq”方法会调用“is”方法,也就是比较两个对象的地址是否相同。如果我们想要比较两个对象的值是否相等,那么就需要重写“eq”方法。

例如,我们可以定义一个类:

class Person:
    def __init__(self, name):
        self.name = name

    def __eq__(self, other):
        if isinstance(other, Person):
            return self.name == other.name
        return False

这个类中,我们定义了“eq”方法,用来比较两个Person对象的name属性是否相等。我们可以用以下代码来测试一下两个Person对象是否相等:

p1 = Person("Tom")
p2 = Person("Tom")
print(p1 == p2)  # True
“is”

“is”是Python中的一个运算符,用来比较两个对象的地址是否相同。通常情况下,我们不应该使用“is”来比较两个对象是否相等,因为两个对象的值可能相等,但是它们的地址不同。而使用“is”来比较两个对象是否相等,只有当它们的地址相同时才会返回True。

s1 = "hello"
s2 = "hello"
s3 = "".join(["h", "e", "l", "l", "o"])
print(s1 == s2)  # True
print(s1 == s3)  # True
print(s1 is s2)  # True
print(s1 is s3)  # False

上述代码中,我们定义了三个字符串变量s1、s2和s3。虽然它们的值都是“hello”,但是s3是通过字符串拼接得到的,和s1与s2的地址是不同的。因此,使用“is”比较s1和s2会返回True,而比较s1和s3会返回False。

“==”

“==”也是Python中的一个运算符,用来比较两个对象的值是否相等。与“eq”不同的是,使用“==”比较两个对象时,如果这两个对象的类型不同,并且它们的值也不同,那么比较结果就会是False。

s = "hello"
i = 10
print(s == i)  # False

上述代码中,我们将一个字符串s和一个整数i进行了比较。由于它们的类型不同,所以比较结果是False。

总结

在Python中,“eq”、“is”和“==”有着不同的用途。如果我们想要比较两个对象的地址是否相同,那么就应该使用“is”运算符;如果我们想要比较两个对象的值是否相等,那么就应该使用“==”运算符或者重写对象的“eq”方法。