_ 是一个“临时”或“忽略”的变量名
在 for _ in ... 结构中,_ 本身并不是 Python 的关键字,而是一个合法的变量名,在 Python 社区中,它有一个非常普遍的约定俗成的用法:

_ 被用作一个“临时变量”或“哑元变量”(Dummy Variable),用来表示你将要迭代的某个值,但你并不打算在循环体内部使用这个值。
它的意思是:“我知道这里会有一个值,但我现在不需要它,所以我就用一个 _ 来占个位符。”
为什么使用 for _ in ...?
主要有以下几个原因:
当你只关心循环次数,不关心循环的值
这是最常见的用法,当你只想让某段代码执行固定的次数,而不需要用到循环变量时,for _ in range(...) 就非常方便。

对比一下:
不推荐的做法 (用一个有意义的变量名,但实际不使用):
# 我们只想打印5次 "Hello World"
for i in range(5): # i 是一个有意义的变量名,暗示它是索引
print("Hello World")
# 这会让阅读代码的人困惑:为什么定义了 i 却不用?是不是忘了用?
推荐的做法 (使用 _):
# 我们只想打印5次 "Hello World"
for _ in range(5): # _ 清晰地表明:我们只关心循环执行了5次,不关心每次的值
print("Hello World")
代码意图非常清晰,避免了混淆。

当你忽略从可迭代对象中解包的某个值
当你从一个元组、列表等可迭代对象中解包多个值,但只想使用其中一部分时,_ 是一个绝佳的占位符。
例子:
假设你有一个函数返回一个元组 (x, y, z),但你只需要 x 和 z。
data = (10, 20, 30) # x=10, y=20, z=30
# 不推荐的做法
x = data[0]
z = data[2]
# 这样写很啰嗦,而且如果元组结构变化,容易出错
# 推荐的做法 (使用 _)
x, _, z = data
print(f"x 的值是: {x}") # 输出: x 的值是: 10
print(f"z 的值是: {z}") # 输出: z 的值是: 30
# print(_) # 如果你尝试打印,它会显示 20,表明它确实被赋值了
这里的 _ 就像一个“黑洞”,吞噬了你不需要的那个值 20。
代码更简洁、意图更明确
使用 _ 可以让其他开发者一眼看出你的代码意图:“我在这里迭代,但我只关心迭代这个行为本身,不关心迭代的具体内容”。
for _ in ... 的具体例子
例子 1:for _ in range(n)
这是最经典的用法,用于固定次数的循环。
# 计算 1 到 100 的累加和,但我们不需要用到具体的数字
total = 0
for _ in range(100):
total += 1 # 这里我们只是单纯地累加,每次加1
print(f"循环了 {total} 次") # 输出: 循环了 100 次
例子 2:for _ in <可迭代对象>
当你遍历一个列表,但只关心列表的长度时。
my_list = ['apple', 'banana', 'cherry', 'date']
# 我们只想处理列表中的前3个元素,不关心具体是哪个元素
for _ in my_list[:3]:
print("处理了一个水果...")
# 输出:
# 处理了一个水果...
# 处理了一个水果...
# 处理了一个水果...
例子 3:在多变量解包中忽略值
这在处理函数返回值或数据库查询结果时非常有用。
def get_user_info():
"""模拟从数据库获取用户信息,返回 (id, username, email, registration_date)"""
return (101, "john_doe", "john@example.com", "2025-01-15")
# 我们只需要用户ID和用户名
user_id, username, _, _ = get_user_info()
print(f"用户ID: {user_id}, 用户名: {username}")
# 输出: 用户ID: 101, 用户名: john_doe
_ 的其他常见用法(进阶)
_ 这个约定在 Python 中不止用在 for 循环里:
-
在交互式解释器中:
_代表上一个表达式的结果。>>> 2 + 2 4 >>> _ 4 >>> print(_) 4
-
作为函数参数的“国际化”占位符:在 gettext 模块中,用于标记需要被翻译的字符串,但不提取原始字符串。
from gettext import gettext as _ # ... 国际化设置 ... print(_("Welcome to my application!")) # 这里的 `_` 是一个函数调用,不是我们讨论的变量名。 # 但为了不混淆,通常会给 gettext 函数起个别名,`_t`。 -
作为临时变量名:在单次代码块中,如果你需要一个临时变量但不想费心取名,也可以用
_,但这在for循环中更为常见和标准。
| 语法 | 含义 | 何时使用 |
|---|---|---|
for item in my_list: |
遍历 my_list,并将每个元素赋值给变量 item,并在循环体内使用它。 |
当你需要处理可迭代对象中的每一个具体元素时。 |
for _ in my_list: |
遍历 my_list,但忽略每个元素的值,你只关心循环被执行了多少次。 |
当你只关心循环的次数,或者迭代行为本身,而不关心元素内容时。 |
for _ in ... 的最后,紧跟的是一个可迭代对象(如 range(10)、[1, 2, 3]、"hello" 等)。_ 只是一个约定俗成的、用于“忽略”值的占位符变量名,掌握它能让你的 Python 代码更加地道和易于理解。
