Python == 比较的是什么?以及_eq_魔术方法


0 前言

最近在学另一门编程语言,里面讲到了关于java中 == 究竟是在比较什么东西?

java中的 == 比较什么?参考博客

然后我就对Python中的等等也产生了一些疑惑,Python中的 == 是在比较什么呢?

于是就有了这篇博客记录一下。

先说结论:由于Python中的一切都是对象,于是我自然就想到了Python中是不是所有东西都是比较引用呢?很遗憾,猜错了。

实际上,Python中 == 比较的是对象的值(内容)。 要比较对象引用(地址),需要使用 is 操作符。

关于这个 对象的值(内容)这个东西就不太好理解了,需要将下面各种数据类型依次列出来才好理解究竟想表达什么。接着看下面:

在Python中,== 比较的是对象的值(内容),意思是它比较的是对象在逻辑意义上的相等性,而不仅仅是物理意义上的同一性。这种相等性由对象的类型及其定义的比较方法决定。具体而言,不同类型的对象在定义相等性时有不同的方式,通常通过实现特定的方法来比较它们的内容。

1 数值类型(基本数据类型)

对于数值类型,如整数(int)和浮点数(float),== 比较的是数值的大小。
基本数据类型:对于基本数据类型(如整数、浮点数、布尔值等),它们的“值”指的是它们的具体数据内容。

a = 10
b = 10
print(a == b)  # 输出 True,因为数值相等

2 字符串类型

对于字符串,== 比较的是字符串的字符序列。

s1 = "hello"
s2 = "hello"
print(s1 == s2)  # 输出 True,因为字符序列相等

3 列表、元组和字典

对于列表(list)、元组(tuple)和字典(dict),== 比较的是它们的元素是否逐一相等。
具体而言:

  • 列表(list):如果两个列表包含相同顺序和相同元素,它们被认为是相等的。
  • 元组(tuple):只要两个元组包含相同顺序和相同元素,它们也被认为是相等的。
  • 集合(set):集合无序且元素唯一,只要两个集合包含相同的元素,它们被认为是相等的。
l1 = [1, 2, 3]
l2 = [1, 2, 3]
print(l1 == l2)  # 输出 True,因为列表内容相等

t1 = (1, 2, 3)
t2 = (1, 2, 3)
print(t1 == t2)  # 输出 True,因为元组内容相等

d1 = {'a': 1, 'b': 2}
d2 = {'a': 1, 'b': 2}
print(d1 == d2)  # 输出 True,因为字典内容相等

4 自定义对象(通常默认是比较引用)

对于自定义对象,== 的行为取决于对象的类是否定义了 __eq__ 方法。如果没有定义,默认使用 object 类的实现,比较对象的引用(即物理意义上的同一性)。

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

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

p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
print(p1 == p2)  # 输出 True,因为两个对象的 name 和 age 属性相等

什么意思?通俗的来说

  • 如果你的自定义类里面自定义了__eq__方法,那就按你自定义的eq方法来比较,例如前面的列表这些就是在里面自定义了eq方法
  • 如果你的自定义类没有_eq__方法, 那就默认使用比较引用,这是因为没有eq方法只能继承最大的那个类里面的方法了,那就是比较引用。

5 深入理解对象的值

对象的值取决于它的类型和定义的比较逻辑。对于内置类型,Python已经定义了合理的比较方法。对于自定义类型,你可以通过实现 __eq__ 方法来自定义比较逻辑,使得 == 可以用于逻辑意义上的比较,而不仅仅是物理意义上的比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值