is比较对象内存地址是否相同,==比较值是否相等;is用于none、单例等同一性判断,==用于数值、字符串、列表等内容相等判断。

is 比较的是两个变量是否指向**同一个对象(内存地址相同)**,== 比较的是两个对象的**值是否相等(调用 __eq__ 方法)**。
is 判断的是身份(identity),不是内容
Python 中每个对象在内存中都有唯一地址,is 就是直接比较这两个地址是否一致。它不关心对象长什么样,只看是不是“同一个东西”。
- 小整数(-5 到 256)和短字符串等会被缓存,所以常出现
a is b为True,但这属于实现细节,不能依赖 -
None、True、False是单例,推荐用is判断,比如if x is None: - 列表、字典、自定义对象即使内容一样,
is也几乎总是False,因为它们是不同对象
== 判断的是相等性(equality),可被自定义
== 默认调用对象的 __eq__ 方法。内置类型已实现合理逻辑:数值比大小、字符串比字符序列、列表比元素顺序和内容等。
- 你可以为自定义类重写
__eq__,让两个不同对象在逻辑上“相等” - 如果没定义
__eq__,会退化为is行为(即比较地址) -
==可能触发类型转换或复杂计算(如浮点数容差比较需手动处理)
常见误用场景
把 is 当作“值相等”用,尤其在比较数字或字符串时容易出错:
立即学习“Python免费学习笔记(深入)”;
-
1000 is 10**3→False(虽然值一样,但生成了两个不同整数对象) -
"hello" is "hello"→ 可能True(字符串驻留),但"hello world" is "hello world"在某些环境下是False -
[] == []→True,但[] is []→False(每次[]都新建一个空列表)
怎么选?记住这个原则
用 is 判断“是不是同一个东西”,典型如 None、函数返回标识、单例对象;用 == 判断“值是否一样”,适用于绝大多数数据比较场景。
不确定时,优先用 ==;确认要判断对象同一性时,才用 is。










