Python is与==区别_对象比较原理

7次阅读

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

Python is与==区别_对象比较原理

is 比较的是两个变量是否指向**同一个对象(内存地址相同)**,== 比较的是两个对象的**值是否相等(调用 __eq__ 方法)**。

is 判断的是身份(identity),不是内容

python 中每个对象在内存中都有唯一地址,is 就是直接比较这两个地址是否一致。它不关心对象长什么样,只看是不是“同一个东西”。

  • 小整数(-5 到 256)和短字符串等会被缓存,所以常出现 a is bTrue,但这属于实现细节,不能依赖
  • NoneTrueFalse 是单例,推荐用 is 判断,比如 if x is None:
  • 列表、字典、自定义对象即使内容一样,is 也几乎总是 False,因为它们是不同对象

== 判断的是相等性(equality),可被自定义

== 默认调用对象的 __eq__ 方法。内置类型已实现合理逻辑:数值比大小、字符串比字符序列、列表比元素顺序和内容等。

  • 你可以为自定义类重写 __eq__,让两个不同对象在逻辑上“相等”
  • 如果没定义 __eq__,会退化为 is 行为(即比较地址)
  • == 可能触发类型转换或复杂计算(如浮点数容差比较需手动处理)

常见误用场景

is 当作“值相等”用,尤其在比较数字或字符串时容易出错:

立即学习Python免费学习笔记(深入)”;

  • 1000 is 10**3False(虽然值一样,但生成了两个不同整数对象)
  • "hello" is "hello" → 可能 True(字符串驻留),但 "hello world" is "hello world" 在某些环境下是 False
  • [] == []True,但 [] is []False(每次 [] 都新建一个空列表)

怎么选?记住这个原则

is 判断“是不是同一个东西”,典型如 None、函数返回标识、单例对象;用 == 判断“值是否一样”,适用于绝大多数数据比较场景。

不确定时,优先用 ==;确认要判断对象同一性时,才用 is

text=ZqhQzanResources