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
相关产品推荐
相关产品推荐

