Python 其实只有一种“真正的注释”:#
三个引号 """ 根本不是注释,它是「字符串」

很多人误以为 Python 有两种注释,这是误解


一、# 才是 Python 唯一的“注释语法”

例子

# 这是注释
x = 1  # 这也是注释

特点

  • 解释器 完全忽略
  • 不占内存
  • 运行时不存在
  • 只能单行

👉 这是你熟悉的 JS //、Java //


二、那 """ ... """ 到底是什么?

本质:多行字符串(multiline string)

s = """
hello
world
"""

这在 Python 里是一个 合法的字符串对象


三、那为什么大家“拿它当注释用”?(关键点)

因为 Python 有一个特殊规则:Docstring


四、什么是 Docstring(文档字符串) ⭐⭐⭐

当一个字符串出现在特定位置时,Python 会赋予它“文档意义”。

位置规则

字符串必须是:

  • 模块的第一行
  • 函数体的第一行
  • 类体的第一行

示例 1:模块 Docstring

"""
This module handles user authentication.
"""

👉 等价于:

__doc__ = "This module handles user authentication."

示例 2:函数 Docstring

def add(a, b):
    """
    Add two numbers and return the result.
    """
    return a + b

👉 你可以这样访问:

print(add.__doc__)

五、所以 """ 在这里不是注释,而是“被 Python 保存的字符串”

关键区别(非常重要)

对比 # 注释 """ docstring """
是否是语法 ❌ 不是
是否是对象 ✅ 是
是否占内存 ✅ 是
是否可反射 ✅ 是
是否能被工具读取 ✅ 是

六、那如果我在代码中间写 """ 呢?

例子

x = 1

"""
this is not a comment
"""

y = 2

实际发生了什么?

  • 这是一个 匿名字符串
  • Python 创建了它
  • 然后立刻丢弃(没绑定变量)

👉 不是注释,只是“没用的字符串”


七、那为什么 Python 不干脆做一个 /* */

这是 Python 的设计哲学问题。

Guido 的想法(核心):

“代码已经够多符号了,不要再引入一种注释语法”

于是:

  • #:明确、简单
  • """:复用字符串机制

八、对比 JS / Java,你会更清楚

JS / Java

// 单行
/* 多行 */

👉 注释只给人看


Python

# 给人和解释器都不看的
""" 给人 + 工具 + IDE + 文档生成器看的 """

九、为什么这在工程里非常有价值?

因为:

  • help(func) 能显示
  • IDE 能提示
  • FastAPI 自动生成接口文档
  • Sphinx 自动生成文档

FastAPI 示例(你一定会遇到)

@app.get("/users")
def get_users():
    """
    Get all users.
    """

👉 Swagger UI 里会直接显示这段话


十、什么时候用 #,什么时候用 """

# 的场景

  • 临时说明
  • 实现细节
  • TODO
  • 为什么这么写
# hack: fix timezone bug

""" 的场景

  • 模块说明
  • 函数/类对外说明
  • API 文档
def login():
    """
    Authenticate user and return JWT token.
    """

十一、和你当前 AI / LangChain 项目强相关的一点

你写的这个:

"""
A minimal "agent" demo using a simple tool function.
"""

不是注释,而是:

  • 被 IDE
  • help()
  • 被文档工具

当成“正式接口说明”的


十二、终极总结

1️⃣ Python 只有 # 是注释
2️⃣ """ 是字符串,只是在特定位置变成 Docstring
3️⃣ Docstring 是 Python 工程、文档、框架的核心机制

在 Python 里,字符串(string)有多种表示方式,既是为了方便,也是为了可读性、功能性(比如多行、转义、模板化等)。下面我从新手视角,按“从常用到进阶”系统讲一遍。


字符串的表示方法

一、最基础:单引号 ' 和双引号 "

1️⃣ 单引号字符串

s = 'hello'

2️⃣ 双引号字符串

s = "hello"

👉 区别?

没有本质区别,只是风格问题。

但在这两种情况下有一个实际用途差异:

s = "I'm a developer"
s = 'He said "hello"'

👉 避免转义,读起来更清楚。


二、转义字符 \(在单 / 双引号中)

当字符串里包含引号或特殊字符时:

s = 'I\'m a developer'
s = "He said \"hello\""

常见转义字符:

转义 含义
\n 换行
\t 制表符
\\ 反斜杠
\" 双引号
\' 单引号
print("hello\nworld")

三、三引号字符串('''"""

3️⃣ 多行字符串(重点)

s = """
Hello
World
Python
"""

等价于:

s = "Hello\nWorld\nPython"

👉 常见用途

1. 多行文本
sql = """
SELECT *
FROM users
WHERE age > 18
"""
2. 文档字符串(docstring)
def add(a, b):
    """
    计算两个数的和
    """
    return a + b

📌 你之前问过的三个引号,本质上就是字符串,只是被 Python 当成“文档注释”来用。


四、原始字符串 r"..."(raw string)

4️⃣ 不转义字符串

s = r"C:\Users\name\test"

如果不用 r

s = "C:\Users\name\test"  # ❌ \U 会被当成转义

👉 常见用途

  • 正则表达式
  • Windows 路径
pattern = r"\d+\.\d+"

五、格式化字符串(非常重要)

5️⃣ f-string(Python 3.6+,强烈推荐

name = "Tom"
age = 18

s = f"My name is {name}, I am {age} years old"

支持表达式:

f"{age + 1}"
f"{price:.2f}"

📌 现代 Python 的首选方式


6️⃣ str.format()

s = "Hello {}, age {}".format("Tom", 18)

带名字:

s = "Hello {name}, age {age}".format(name="Tom", age=18)

7️⃣ 老式 % 格式化(不推荐)

s = "Hello %s, age %d" % ("Tom", 18)

📌 老代码里会见到,新代码不要用


六、字节字符串 b"..."

8️⃣ bytes 字符串(不是 str)

s = b"hello"
type(s)  # <class 'bytes'>

👉 用途

  • 网络通信
  • 文件读写
  • 编码/解码
b = "hello".encode("utf-8")
s = b.decode("utf-8")

七、字符串前缀可以组合使用

s = rf"User path: {path}\n"

合法组合:

组合 含义
f"..." 格式化
r"..." 原始字符串
rf"..." 原始 + 格式化
b"..." 字节
fr"..." 同上

⚠️ fb 不能一起用


八、总结一张“记忆表”

写法 作用
'...' 普通字符串
"..." 普通字符串
'''...''' 多行字符串 / docstring
"""...""" 多行字符串 / docstring
r"..." 原始字符串
f"..." 格式化字符串(推荐)
b"..." 字节字符串
rf"..." 原始 + 格式化

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐