这段代码中的_
after是什么意思?for
if tbh.bag:
n = 0
for _ in tbh.bag.atom_set():
n += 1
这段代码中的_
after是什么意思?for
if tbh.bag:
n = 0
for _ in tbh.bag.atom_set():
n += 1
_
在 Python 中有 3 个主要的常规用途:
在交互式解释器会话中保存最后执行的表达式的结果(请参阅文档)。这个先例是由标准 CPython 解释器开创的,其他解释器也纷纷效仿
对于 i18n 中的翻译查找(例如,参见 gettext 文档),如代码中所示
raise forms.ValidationError(_("Please enter a correct username"))
作为通用的“一次性”变量名:
表示函数结果的一部分被故意忽略(从概念上讲,它被丢弃了。),如代码所示:
label, has_label, _ = text.partition(':')
作为函数定义的一部分(使用def
或lambda
),其中签名是固定的(例如,通过回调或父类 API),但这个特定的函数实现不需要所有参数,如下代码所示:
def callback(_):
return True
[很长一段时间以来,这个答案都没有列出这个用例,但它经常出现,如此处所述,值得明确列出。]
此用例可能与翻译查找用例发生冲突,因此有必要避免_
在任何也将其用于 i18n 翻译的代码块中用作一次性变量(许多人更喜欢双下划线__
, 作为他们的一次性变量这个原因)。
Linter 通常会识别此用例。例如,如果稍后在代码中未使用,year, month, day = date()
则会引发 lint 警告。day
如果day
确实不需要,解决方法是编写year, month, _ = date()
. 与 lambda 函数相同,lambda arg: 1.0
创建一个需要一个参数但不使用它的函数,它将被 lint 捕获。解决方法是编写lambda _: 1.0
. 未使用的变量通常隐藏错误/错字(例如设置day
但dya
在下一行中使用)。
Python 3.10 中添加的模式匹配功能将这种用法从“约定”提升为“语言语法”,其中match
涉及语句:在匹配情况下,_
是通配符模式,在这种情况下,运行时甚至不会将值绑定到符号.
对于其他用例,请记住它_
仍然是一个有效的变量名,因此仍将保持对象处于活动状态。在不希望这样做的情况下(例如释放内存或外部资源),显式del name
调用将满足正在使用该名称的 linter,并立即清除对对象的引用。
它只是一个变量名,在 python 中_
用于一次性变量是常规的。它只是表示实际上并未使用循环变量。
下划线在 Python_
中被视为“我不在乎”或“一次性”变量
python 解释器将最后一个表达式值存储到名为_
.
>>> 10
10
>>> _
10
>>> _ * 3
30
下划线_
也用于忽略特定值。如果您不需要特定值或未使用这些值,只需将值分配给下划线即可。
解包时忽略一个值
x, _, y = (1, 2, 3)
>>> x
1
>>> y
3
忽略索引
for _ in range(10):
do_something()
在 Python 中使用下划线有 5 种情况。
用于在解释器中存储最后一个表达式的值。
忽略特定值。(所谓的“我不在乎”)
赋予变量或函数的名称以特殊的含义和功能。
用作“国际化 (i18n)”或“本地化 (l10n)”功能。
分隔数字文字值的数字。
这是一篇不错的文章,带有mingrammer的示例。
就 Python 语言而言,_
一般没有特殊含义。它是一个有效的标识符,就像_foo
,foo_
或_f_o_o_
。
唯一的例外是match
Python 3.10 之后的语句:
在语句中的
case
模式中,是表示通配符的软关键字。来源match
_
否则,任何特殊含义_
纯属约定俗成。几种情况很常见:
不打算使用变量时的虚拟名称,但语法/语义需要名称。
# iteration disregarding content
sum(1 for _ in some_iterable)
# unpacking disregarding specific elements
head, *_ = values
# function disregarding its argument
def callback(_): return True
许多 REPL/shell 将最后一个顶级表达式的结果存储到builtins._
.
交互式解释器中使用特殊标识符
_
来存储上次评估的结果;它存储在builtins
模块中。不处于交互模式时,_
没有特殊含义,也没有定义。[来源]
由于查找名称的方式,除非被全局或局部_
定义遮蔽,否则 bare_
指的是builtins._
.
>>> 42
42
>>> f'the last answer is {_}'
'the last answer is 42'
>>> _
'the last answer is 42'
>>> _ = 4 # shadow ``builtins._`` with global ``_``
>>> 23
23
>>> _
4
注意:某些 shell,例如ipython
不分配给builtins._
但 special-case _
。
在上下文国际化和本地化中,_
用作主要翻译功能的别名。
gettext.gettext(消息)
根据当前的全局域、语言和语言环境目录返回消息的本地化翻译。此函数通常
_()
在本地命名空间中使用别名(参见下面的示例)。