You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中值与子节点均相同的Node对象用==比较为何返回False?

Python自定义类对象的==比较问题分析

示例代码

class Node:
    def __init__(self, left=None, right=None, val=0):
        self.left = left
        self.right = right
        self.val = val

# 创建树结构
abc = Node(val=1)
abc.left = Node(val=2)
abc.right = Node(val=2)
abc.left.left = Node(val=3)
abc.left.right = Node(val=3)
abc.right.left = Node(val=3)
abc.right.right = Node(val=3)

print(abc.left == abc.right)  

# 输出: False

问题说明

创建了值及子节点值均相同的两个Node对象,使用Python的==运算符比较时预期返回True,但实际输出为False。明明知道它们存储在不同内存地址,但==运算符应该比较对象的相等性或值,为何这两个节点会被判定为不同?

此外,ChatGPT给出的如下回答是否正确?

==运算符在列表的情况下比较值,但在Node这类类的实例的情况下比较对象本身。

问题解答

1. 为什么==返回False

Python中,自定义类的实例默认使用==比较时,行为等价于is运算符——比较对象的内存地址(即是否为同一个对象)。这是因为所有自定义类默认继承自object类,而object的__eq__()方法默认实现就是判断两个对象的身份是否一致(self is other)。

你创建的abc.left和abc.right是两个独立的Node实例,即使它们的属性值和子节点结构完全相同,本质上仍是内存中的两个不同对象,所以默认的==会返回False。

如果需要让==按对象的"值相等"来比较,必须在Node类中重写__eq__()方法,递归比较所有相关属性:

class Node:
    def __init__(self, left=None, right=None, val=0):
        self.left = left
        self.right = right
        self.val = val

    def __eq__(self, other):
        # 先判断是否为同一对象,快速返回
        if self is other:
            return True
        # 排除非Node实例的情况
        if not isinstance(other, Node):
            return False
        # 递归比较val、left、right属性
        return self.val == other.val and self.left == other.left and self.right == other.right

修改后重新运行代码,print(abc.left == abc.right)会返回True。

2. ChatGPT的回答是否正确

该回答是正确的。Python内置的序列类型(如列表、元组)已经重写了__eq__()方法,使得==会逐元素比较值是否相等;而自定义类如果没有显式重写__eq__(),就会沿用object类的默认逻辑,即比较对象本身的身份(是否为同一个实例)。


内容的提问来源于stack exchange,提问作者User_04_04_2023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:30:22