==比较的是值而非内存地址,它调用对象的__eq__方法判断逻辑相等性;is才比较内存地址(id是否相同);自定义类需重写__eq__以确保按内容比较。

它其实不是比较内存地址——这是常见误解。
== 比较的是值,不是内存地址
Python 中 == 运算符默认调用对象的 __eq__ 方法,目的是判断「逻辑上的相等性」,即内容或业务意义上的相同。比如:
-
[1, 2, 3] == [1, 2, 3]→ True(两个独立列表,内容相同) -
"hello" == "hello"→ True(不同字符串对象,值一致) -
5 == 5.0→ True(int 和 float,数值相等)
真正比较内存地址的是 is
is 才是严格比内存地址(即 id(a) == id(b))。例如:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
-
a = [1, 2, 3]; b = a; a is b→ True(同一对象) -
a = [1, 2, 3]; b = [1, 2, 3]; a is b→ False(不同对象,哪怕内容一模一样)
为什么有人觉得 == 在比地址?
可能源于以下几种情况:
-
自定义类没重写
__eq__:此时==会退化为is行为(因为默认继承自object,其__eq__就是按身份比较) -
误把小整数/短字符串的驻留优化当普遍规则:如
256 is 256为 True,但1000 is 1000很可能为 False——这属于 CPython 实现细节,不是==的本意 -
混淆调试输出:打印
id()后主观认定「== 成立说明地址相同」,忽略了值比较本身不依赖地址
如何确保 == 比的是你想要的内容?
对自定义类,显式定义 __eq__ 方法:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
if not isinstance(other, Point):
return False
return self.x == other.x and self.y == other.y
<p>p1 = Point(1, 2)
p2 = Point(1, 2)
print(p1 == p2) # True —— 比的是属性值,不是地址</p>

















