== 比较值是否相等,调用 __eq__() 方法;is 比较内存地址是否相同,等价于 id(a) == id(b)。例如列表 [1,2,3] 与 [1,2,3] == 为 true、is 为 false;而 c = a 时 a is c 为 true。

不是这样的。直接用双等号(==)判断两个对象,比较的从来不是内存地址,而是值(value)。
== 的本质是调用对象的 __eq__() 方法,用于判断逻辑上的相等性——比如两个列表内容是否一样、两个字符串是否拼写相同、两个数字数值是否相等。它完全不关心这两个对象是不是同一个实例、占不占同一块内存。
真正比较内存地址的是 is 运算符。is 等价于 id(a) == id(b),只看两个变量是否指向同一块内存地址。
举个清楚的例子:
a = [1, 2, 3] b = [1, 2, 3] print(a == b) # True —— 内容相同,值相等 print(a is b) # False —— 是两个独立对象,内存地址不同
再看引用情况:
c = a print(a == c) # True —— 值当然也相等 print(a is c) # True —— 因为 c 就是 a 的另一个名字,指向同一内存
所以误区常出现在:
- 把
==和is混淆; - 看到小整数(如
5 is 5为True)或短字符串(如'hi' is 'hi')误以为==在比地址——其实是 Python 对不可变小对象做了内存缓存优化,但这属于实现细节,==本身仍只管值。
总结一下:
-
==→ 看“长得一样吗?”(值相等) -
is→ 看“是同一个东西吗?”(内存地址相同)
该用哪个,取决于你要问的问题:比内容,用 ==;比身份(比如检查是不是 None),用 is。











