Python中的注释符号是什么:单行#与多行三引号用法

Finn
Finn
发布时间:2026-11-11 | 5人浏览过
原创

深入解析Python中的注释符号:单行井号#的语法规则、多行三引号的本质与误区、文档字符串Docstring的规范应用以及PEP 8注释工程实践。

一、Python 注释符号的本质:为什么官方只有 # 号

初学者查阅 Python 语法手册时,经常会产生一个疑问:许多教程既提到了 #,又演示了成对的三引号,究竟哪一个才是官方规定的注释符号?

答案在 Python 官方词法分析规范(Python Language Reference: Lexical Analysis)中有明确界定:Python 语言中唯一的注释字符是井号(#)。当 Python 解释器的词法分析器(Lexer)读取源代码字符流时,一旦遇到不在字符串字面量内部的 # 字符,该字符及其后直至本行行末的所有内容都会被彻底忽略,完全不参与后续语法标记(Token)的生成,也不会进入抽象语法树(AST)。

单行注释在日常编写中主要有两种应用形式:独占一行的块注释(Block Comments)以及跟在代码语句后方的行尾注释(Inline Comments)。

# 这是标准的块注释:独占一行,解释后续逻辑
def calculate_discount(price, rate):
    # 校验折扣率是否处于合理区间 0 到 1 之间
    if not (0 < rate <= 1.0):
        raise ValueError("折扣率必须在 0 到 1 之间")
    
    final_price = price * rate  # 计算折后实付价格(行尾注释)
    return final_price
PEP 8 官方代码风格指南对单行 # 注释的排版约束:
  • 空格规范:# 符号与随后的注释文字之间,必须保留且仅保留一个空格(例如写作 # 说明,而不是 #说明)。
  • 行尾注释间距:若将 # 放置在可执行代码语句同一行的末尾,代码语句结束与 # 之间至少应保留 2 个空格,以保证阅读时视觉层次分明。
  • 缩进同步:独占一行的块注释必须与它所说明的那一行代码保持完全相同的缩进层级。

二、如何做决策:单行、多行与文档说明的选用流程

既然官方语法没有专门提供类似 C/Java 的 /* ... */ 原生多行注释标记,我们在日常开发中面对复杂的多行说明、模块架构描述或临时代码调试时,应该如何选择最恰当的表达手段?

根据 PEP 8 和 PEP 257 规范,开发者应遵循一条清晰的决断链路:若文字是为了供外部调用者与 IDE 查阅接口契约,必须使用三引号构建规范的 Docstring;若文字用于解释内部算法逻辑,推荐使用连续多行的 #;若仅是本地排查故障需要快速屏蔽整段已有代码,三引号或 IDE 快捷键是高效的临时手段。

Python中的注释符号是什么:单行#与多行三引号用法
图 1:Python 注释类型与书写形式决策流程图

1. 规范的多行注释方式:连续多行 # 号

Python 官方指南 PEP 8 明确推荐的多行长文本注释方式是在每一行开头都添加一个 # 符号。这种方式从语法层面具备最高安全性,完全不改变程序的抽象语法树结构,也不会带来意外的缩进陷阱。

# 数据预处理模块核心管道:
# 1. 过滤包含缺失关键字段(如 user_id、timestamp)的脏数据行;
# 2. 将 UTC 时间戳格式化为本地时区的 ISO-8601 标准字符串;
# 3. 对金额字段执行四舍五入并统一转换为以分为单位的整数。
def sanitize_records(raw_list):
    clean_list = []
    for item in raw_list:
        if item.get("user_id") is not None:
            clean_list.append(item)
    return clean_list

在现代代码编辑器(如 VSCode、PyCharm、Cursor)中,开发者只需选中多行代码并按下组合快捷键 Ctrl + /(macOS 下为 Cmd + /),编辑器就会自动在选中的每一行行首添加或移除 #,其实际操作效率甚至高于手动敲击成对的三引号。

三、深入底层:三引号多行字符串与 # 注释的运行机制

许多初学者会将包裹在三单引号 ''' 或三双引号 """ 之间的文字称为“多行注释”。在很多场景下这确实能起到不影响程序运行的效果,但深入解释器底层会发现,两者的运行原理存在根本差别。

Python中的注释符号是什么:单行#与多行三引号用法
图 2:Python 解释器对 # 注释与三引号字符串在词法、AST 与字节码阶段的处理流程

三引号在 Python 中的正统语法身份是多行字符串字面量(Multi-line String Literals)。理解它的运行逻辑需要区分两个关键阶段:

  • 词法分析与 AST 构建阶段:词法分析器不会丢弃三引号内容,而是将其完整解析为一个完整的 STRING 标记(Token),并在抽象语法树中实例化为一个常量表达式节点(ast.Constant)。
  • 字节码生成阶段:如果该三引号字符串不是紧跟在模块、类或函数定义后的第一条有效语句,且没有通过等号赋值给任何变量,Python 编译器的代码优化器会识别出该表达式没有产生副作用(Side-effect free),进而在输出 .pyc 字节码时将其从执行指令流中剔除。
关键陷阱:缩进错误(IndentationError)

正因为三引号本质上是表达式语句,它必须严格遵守 Python 的缩进规则。如果在一个受缩进约束的代码块(如循环、条件分支或函数体内)使用三引号进行“注释”,但三引号起始或内部行的缩进与当前代码块不匹配,Python 解释器在编译期就会直接抛出语法致命错误:

def demo_error():
    x = 10
# 错误写法:三引号顶格写,破坏了函数体4空格缩进
"""
临时屏蔽下面这行计算逻辑:
x += 20
"""
    return x
# 运行结果:IndentationError: unexpected indent / unindent

而真正的 # 注释则不会受到此类语法限制,哪怕在函数体内部任意空行或行首书写,都不会破坏 Python 的缩进解析。

四、三引号的标准使命:文档字符串(Docstring)与 PEP 257 规范

如果说 # 注释是写给代码维护者看的“实现细节说明”,那么三引号的真正核心价值在于充当“文档字符串(Docstring)”,它是写给调用者看的“接口使用契约”。

当三单引号或三双引号紧跟在模块开头、类定义首行或函数定义首行时,Python 解释器会做特殊处理:它不仅不会丢弃该字符串,还会自动将其编译并绑定到对应对象的 __doc__ 特殊属性中。

Python中的注释符号是什么:单行#与多行三引号用法
图 3:Python 标准工程中的文件架构、Docstring 布局与行内注释位置规范

Docstring 的规范书写范例

根据 PEP 257(Docstring Conventions)约定,所有的文档字符串统一建议使用三个双引号("""),而不是三单引号(''')。单行文档字符串可以写在同一行,而多行文档字符串推荐采用总结行、空行加详细说明的结构:

def fetch_user_profile(user_id: int, timeout: int = 5) -> dict:
    """根据用户唯一标识拉取详细用户资料.

    通过内部 RPC 接口拉取用户基本信息与授权状态。如果遇到网络抖动,
    将在超时时间内最多自动重试两次。

    :param user_id: 系统分配的唯一整型用户 ID
    :param timeout: 请求超时阈值,单位为秒,默认为 5 秒
    :return: 包含 nickname, email 与 roles 的字典对象
    :raise UserNotFoundError: 当指定 user_id 在数据库中不存在时抛出
    :raise TimeoutError: 当网络请求超出指定等待时间时抛出
    """
    # 内部实现代码
    result = {"user_id": user_id, "status": "active"}
    return result

当这样编写之后,其他开发者在 IDE 中鼠标悬停在该函数上时,IDE 就能自动弹出格式化的高亮提示;在交互式控制台中执行 help(fetch_user_profile) 或直接打印 fetch_user_profile.__doc__ 也能即时获取到详尽文档,甚至自动化工具(如 Sphinx、pydoc)可以直接提取这些内容生成整套 HTML API 文档网站。

五、综合总结:单行 # 与多行三引号全维度对比

为了在工程开发中避免混淆和用错场景,下表与图示全面总结了 Python 中井号注释与三引号文本的核心差异:

Python中的注释符号是什么:单行#与多行三引号用法
图 4:Python 单行 # 注释与三引号字符串核心维度对比矩阵
比较维度 单行注释(# 符号) 三引号(未赋值,充当注释) 三引号(文档字符串 Docstring)
语言官方定位 Python 唯一官方定义的语法注释 多行字符串字面量(伪注释) 语言级一等公民文档对象
词法分析行为 直接被词法分析器过滤丢弃 生成 STRING Token 与 AST 节点 生成 STRING Token 与 AST 节点
字节码与内存 完全不占用字节码与运行时内存 被编译器优化跳过,无常驻内存 编译进常量池,绑定到 __doc__
缩进语法限制 无语法缩进限制,灵活自由 首行必须符合外层语法缩进 必须严格符合所在函数/类的缩进
IDE与工具支持 语法高亮与折叠辅助 视作普通字符串或无用表达式警告 驱动智能代码补全、悬浮提示与文档生成
最佳实践推荐 实现细节阐述、多行连续加 # 本地排查时快速临时屏蔽代码块 所有公共模块、类与函数的规范说明

六、写好 Python 注释的工程建议

掌握了注释符号与书写方式后,在实际编码中还应遵循“代码自解释”的工程共识:

  • 注释回答“Why”,代码回答“What”:不要写纯粹复述代码字面意思的废话注释(如 i += 1 # 变量i自增1),而应解释为什么采取这种特殊的实现方式、背后有哪些业务规则约束或绕过了哪些已知缺陷。
  • 随代码同步更新:错误的、过时的注释比没有注释危害更大。在重构或调整业务逻辑时,必须第一时间修正关联的单行 # 与 Docstring。
  • 调试完成及时清理:临时使用三引号屏蔽的代码块,在提交到版本控制仓库(Git)前应当予以删除或转换为正规注释,避免在代码库中遗留大量未绑定字符串常量。
相关专题:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表