一般都认为python中:
is
比较的是两对象的内存地址,也就是身份比较==
比较的是两对象的值
这种理解也没错,但是需要注意一个前提,当说==
比较的是对象的值时,这里的对象其实仅指的是python中自带的一些可变容器类型,比如列表。因为这些容器类型源码中已经预实现了__eq__
方法,当在python中使用==
比较运算符时,其实调用的就是这个方法。
如果对象的类或父类中没有实现这个魔术方法,==
的作用和is
相同,比较的还是对象的内存地址。
class NodeImplEq:
def __init__(self, x):
self.val = x
self.next = None
def __eq__(self, other):
if isinstance(other, NodeImplEq):
return self.val == other.val
class Node:
def __init__(self, x):
self.val = x
self.next = None
if __name__ == '__main__':
node1 = Node(1)
node2 = Node(1)
print(node1 == node2) # False
print(node1 is node2) # False
node3 = NodeImplEq(1)
node4 = NodeImplEq(1)
print(node3 == node4) # True
print(node3 is node4) # False