Python中is与==判断的区别

山间有风
山间有风
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Python中is与==的区别。is比较内存地址,用于判断是否为同一对象;==比较值,通过__eq__方法实现。通过代码示例说明两者在不同场景下的表现,帮助开发者准确选择比较方式。

在Python中,比较两个对象(变量)是否相等,可以使用“is”和“==”操作符,但它们之间存在显著差异。何时使用“is”,何时使用“==”?在面试中,许多候选人难以清晰阐述这两者的区别。因此,本文将对二者进行深入浅出的对比介绍。

首先,通过一个例子来理解。

假设小黄最近手头宽裕,花重金购买了一辆P90D特斯拉,我们暂且给这辆车取名为“小P”。这辆车与隔壁老王家的车(车名叫“小王”)是一模一样的,无论是型号、外观还是价格都相同,且属于同批次生产。我们可以说“小P”和“小王”是两辆一模一样的、相等的(equal)车,但本质上这是两个不同的对象。另一方面,小君给他的爱车又取了一个网名叫“爱驹”。当我们说“小P”时,其实就是在讨论“爱驹”,因为这两个名字指的是同一个对象。这里我们将“小P”和“爱驹”称为完全相等的(identical)。

在Python中,“==”和“is”的区别可以类比上述例子。“==”是相等性比较,用于比较两个对象中的值是否相等;而“is”是一致性比较,用于比较两个对象的内存空间地址是否相同。

显然,如果两个对象的内存地址相同,那么它们的值肯定也是一样的。因此,如果“is”返回True,那么“==”一定也返回True;反之,如果“==”返回True,“is”却不一定返回True。

Talk is cheap, show me the code.

首先创建一个列表对象,然后给它指定一个名字a,再定义另外一个变量b,让它指向同一个对象。

>>> a = [1, 2, 3]
>>> b = a

a和b打印的值都是相等的,因为这两个变量指向的是同一个对象,这就好比给一辆车起了两个不同的名字。

>>> a
[1, 2, 3]
>>> b
[1, 2, 3]

理所当然,is和==都返回True。

>>> a == b
True
>>> a is b
True

创建一个新的对象,尽管值是一样的,但它们本质上是两个不同的对象,处于两个不同的内存空间,因此“is”返回的是False。

>>> c = [1,2,3]
>>> a is c
False

只有当且仅当比较的两个变量指向同一个对象时,“is”才返回True。而“==”最终取决于对象的__eq__()方法,本质上两个变量进行“==”比较操作调用的是对象的__eq__()方法。例如:

>>> class Foo(object):
    def __eq__(self, other):
      return True

>>> f = Foo()
>>> f == 1
True
>>> f == None
True
>>> f is None
False

因为自定义类Foo的__eq__方法恒返回True,因此它与任何对象进行“==”比较都返回True。而它与None是两个不同的对象,因此“is”操作返回的是False。

最后请大家思考这段代码,为什么同样的操作会有不同的结果?

>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 123
>>> b = 123
>>> a is b
True

总结:

如果你要比较两个值是否相同,就用==;如果比较是否是同一个对象,就用is。

其实Python中的is比较的对象很像C语言中的指针,只有地址相同的指针才是同一个指针。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。