0

0

Python 中 is 与 == 的区别及底层实现

舞姬之光

舞姬之光

发布时间:2026-02-18 16:27:03

|

219人浏览过

|

来源于php中文网

原创

is判断对象身份(内存地址),==判断值相等(调用__eq__);仅对none、true、false等单例用is安全,数值和字符串比较必须用==。

python 中 is 与 == 的区别及底层实现

is 判断的是对象身份,== 判断的是值相等

Python 里 is== 看似都能比“是不是一样”,但底层干的事完全不同:is 检查两个变量是否指向**同一个对象**(即内存地址是否相同),而 == 调用的是对象的 __eq__ 方法,比的是“逻辑上是否相等”。这意味着哪怕两个对象内容一模一样,只要不是同一个对象,is 就返回 False

常见错误现象:if x is True:if x is None: 写得顺手,但换成 if x is 1: 就可能翻车——因为整数小常量(-5 到 256)会被缓存复用,超出范围就不再稳定。

  • 只对 NoneTrueFalse 这类单例用 is 是安全且推荐的
  • is 比字符串、列表、自定义对象,基本等于赌运气
  • == 可被重载,比如 numpy.array([1,2]) == numpy.array([1,2]) 返回的是布尔数组,不是单个 True

小整数和短字符串的 is 行为是 CPython 实现细节,别依赖

CPython 为了节省内存,会把常用的小整数(-5 到 256)和某些短字符串(如标识符风格的)放进对象池,重复创建时直接复用。所以 100 is 100True,但 1000 is 1000 在交互式环境里有时是 True、有时是 False——取决于是否在同一个编译单元里被优化。

使用场景:你写脚本时偶然发现 "hello" is "hello" 成立,但这只是因为解释器做了字符串驻留(interning),不是语言规范保证的行为。换到 PyPy 或某些嵌入式 Python 环境,结果可能不同。

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

Unreal Images
Unreal Images

免费的AI图片库

下载
  • 不要用 is 来判断字符串内容是否相同,一律用 ==
  • 不要靠 is 测试数字是否等于某个值,除非是 None 或布尔单例
  • 想确认对象身份?用 id(a) == id(b) 更直白,也更容易被理解意图

自定义类中 == 的行为由 __eq__ 控制,is 完全绕过它

当你定义一个类,默认的 == 行为其实是继承自 object 的,也就是退化成 is——比较的是对象身份。所以如果你没写 __eq__a == ba is b 效果一样;但一旦你实现了 __eq__== 就按你的逻辑走,is 却始终只看地址。

示例:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __eq__(self, other):
        return isinstance(other, Point) and self.x == other.x and self.y == other.y
<p>p1 = Point(1, 2)
p2 = Point(1, 2)
print(p1 == p2)  # True
print(p1 is p2)  # False
  • 实现 __eq__ 时,建议同时实现 __hash__(如果对象要进 set 或作 dict 键)
  • __eq__ 返回 NotImplemented,Python 会尝试调用 other.__eq__(self),这是双向比较机制
  • is 永远不会触发任何魔术方法,它就是纯粹的指针比较

None 检查必须用 is,不能用 ==

这是唯一被 PEP 8 明确规定的例外:if x is None: 是标准写法,if x == None: 不仅慢(触发 None.__eq__),还危险——因为用户可以重载 __eq__== None 返回 True,即使对象根本不是 None

示例:

class BadClass:
    def __eq__(self, other):
        return True  # 故意捣乱
<p>x = BadClass()
print(x == None)  # True ← 错误地通过了
print(x is None)  # False ← 正确拒绝
  • is None 是最快的 None 检查方式,也是唯一语义明确的方式
  • 同理,is Trueis False 也比 == True 更安全,但更常见的是直接写 if x:if not x:
  • 别写 if x is not None: 的反模式变体,比如 if not x is None:,可读性差且容易误读

最易被忽略的一点:很多人以为“== 比较值,is 比较地址”就够了,但真正麻烦的是那些看起来像值、实则带状态的对象——比如浮点数 nan,它连自己都不等于自己(float('nan') == float('nan')False),这时候 is 也救不了你,得用 math.isnan()。底层逻辑清楚,不代表所有边界都自动覆盖。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

591

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1553

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

817

2023.08.22

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

304

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

274

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

140

2025.08.07

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号