提问人:alwbtc 提问时间:5/5/2011 最后编辑:wjandreaalwbtc 更新时间:9/10/2023 访问量:422924
Python 中单下划线“_”变量的目的是什么?
What is the purpose of the single underscore "_" variable in Python?
问:
此代码中 after 的含义是什么?_
for
if tbh.bag:
n = 0
for _ in tbh.bag.atom_set():
n += 1
答:
它只是一个变量名称,在 python 中通常用于一次性变量。它只是表示实际上没有使用循环变量。_
评论
_
_
_
在 Python 中具有 3 个主要的常规用途:
在交互式中保存上次执行的表达式的结果 口译员会话(见文档)。这个先例是由标准CPython开创的 口译员和其他口译员也纷纷效仿
对于 i18n 中的翻译查找(例如,请参阅 gettext 文档),如在代码中
raise forms.ValidationError(_("Please enter a correct username"))
作为通用的“一次性”变量名称:
指示该部分 的函数结果被故意忽略(从概念上讲,它被丢弃了),如代码所示:
label, has_label, _ = text.partition(':')
作为函数定义的一部分(使用 或 ),其中 签名是固定的(例如,通过回调或父类 API),但 这个特定的函数实现不需要所有的 参数,如代码所示:
def
lambda
def callback(_): return True
[很长一段时间以来,这个答案没有列出这个用例,但正如这里所指出的,它经常出现,值得明确列出。
此用例可能与翻译查找用例冲突,因此有必要避免在任何也将其用于 i18n 翻译的代码块中用作一次性变量(正是出于这个原因,许多人更喜欢使用双下划线作为他们的一次性变量)。
_
__
Linters 经常识别此用例。例如,如果稍后未在代码中使用,将引发 lint 警告。如果确实不需要,解决方法是编写 .与 lambda 函数相同,创建一个需要一个参数但不使用它的函数,该函数将被 lint 捕获。解决方法是编写 .未使用的变量通常会隐藏错误/拼写错误(例如,set 但在下一行中使用)。
year, month, day = date()
day
day
year, month, _ = date()
lambda arg: 1.0
lambda _: 1.0
day
dya
Python 3.10 中添加的模式匹配功能将这种用法从“约定”提升为“语言语法”,其中涉及语句:在匹配情况下,是一种通配符模式,在这种情况下,运行时甚至不会将值绑定到符号。
match
_
对于其他用例,请记住,这仍然是一个有效的变量名称,因此仍将保持对象处于活动状态。在不希望这样做的情况下(例如,释放内存或外部资源),显式调用既会让 linter 知道该名称正在被使用,又会立即清除对对象的引用。
_
del name
评论
_
gettext
__
_
a, __, c = iterable
a, b, c = iterable
a
b
c
在 Python 中,下划线被视为“我不在乎”或“扔掉”变量_
python 解释器将最后一个表达式值存储到名为
_
的特殊变量中。>>> 10 10 >>> _ 10 >>> _ * 3 30
下划线
_
也用于忽略特定值。如果不需要特定值或未使用这些值,只需将值分配给下划线即可。解压缩时忽略值
x, _, y = (1, 2, 3) >>> x 1 >>> y 3
忽略索引
for _ in range(10): do_something()
评论
_("Hello world!")
dis
print
>>> 10
>>> print(_)
在 Python 中使用下划线有 5 种情况。
用于在解释器中存储最后一个表达式的值。
用于忽略特定值。(所谓“我不在乎”)
为变量或函数的名称赋予特殊的含义和功能。
用作“国际化 (i18n)”或“本地化 (l10n)”功能。
分隔数字文字值的数字。
评论
就Python语言而言,一般没有特殊的含义。它是一个有效的标识符,就像 或 一样。
唯一的例外是自 Python 3.10 以来的语句:_
_foo
foo_
_f_o_o_
match
在语句中的模式中,是表示通配符的软关键字。源
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 不分配给 but special-case .
ipython
builtins._
_
在上下文中,国际化和本地化,用作主要翻译功能的别名。
_
gettext.gettext(消息)
根据当前的全局域、语言和区域设置目录返回消息的本地化翻译。此函数通常在本地命名空间中具有别名(请参阅以下示例)。
_()
上一个:如何动态创建变量?[复制]
评论