此代码中_之后的for是什么意思?

if tbh.bag:
   n = 0
   for _ in tbh.bag.atom_set():
      n += 1


评论

参见stackoverflow.com/questions/1739514/as-variable-name-in-python

对于您的情况,使用len(tbh.bag.atom_set())(如果返回的值具有__len__方法)或sum(tbh.bag.atom_set()中的_表示1)会更干净。
在pylint中,虚拟变量名称的另一个选项是变量名称的dummy_前缀。将此前缀与pylint一起使用,可使pylint不发出警告。您还可以配置pylint的虚拟变量模式以适应__。

#1 楼

_在Python中有3种主要的常规用法:


用于在交互式解释器会话中保存最后执行的表达式(/语句)的结果(请参阅docs)。此先例是由标准的CPython
解释器设置的,其他解释器也遵循了该规则。例如),如
raise forms.ValidationError(_("Please enter a correct username"))




这样的代码,作为通用的“ throwaway”变量名称:


表示函数结果的一部分
被有意忽略(从概念上讲,它被丢弃了。),如以下代码所示:
label, has_label, _ = text.partition(':')



作为函数的一部分定义(使用deflambda),其中
签名是固定的(例如,通过回调或父类API),但是
此特定功能实现不需要所有
参数,就像这样的代码:
callback = lambda _: True

[很长一段时间以来,这个答案都没有列出该用例,但是如此处所述,它经常出现足够值得明确列出。]


此用例可能与翻译查找用例冲突,因此它是n必须避免在也将其用于i18n转换的任何代码块中都将_用作抛弃型变量(正是出于这个原因,许多人更喜欢将双下划线__作为其抛弃型变量)。案件。例如,如果以后在代码中未使用year, month, day = date(),则day将发出掉毛警告。如果确实不需要day,那么解决方法是编写year, month, _ = date()。与lambda函数相同,lambda arg: 1.0创建一个需要一个参数但不使用它的函数,该函数将被lint捕获。解决方法是编写lambda _: 1.0。未使用的变量通常会隐藏错误/错别字(例如,设置day但在下一行中使用dya)。



评论


您能否解释一下它在函数调用中的工作方式,例如:raise Forms.ValidationError(_(“请输入正确的用户名”))。我已经在Django代码中看到了这一点,目前尚不清楚发生了什么。

– John C
2011年5月19日13:43

即用法2-按照惯例,_是用于执行国际化和本地化字符串转换查找的函数的名称。我很确定是建立该约定的C gettext库。

– ncoghlan
11年5月19日在16:47



FWIW,我个人开始使用__(双下划线)作为通用的一次性变量,以避免与前两个用例之一冲突。

– ncoghlan
2012-03-20 6:35

新兴的社区惯例往往没有权威来源-只是对随着时间推移出现的做法的观察。 FWIW,我是PEP 8最新更新的合著者之一,而我的答案是基于自2002年我开始专业使用Python以来,我已将_用作变量名的3种不同方式。

– ncoghlan
15年6月28日在3:54

该约定主要用于元组拆包:a,__,c =可迭代告诉读者我们正在拆解3元组,但仅使用第一个和最后一个值。如果我们改写a,b,c =可迭代,则读者(或自动代码linter)可以合理地期望a,b和c的所有元素稍后都可以使用(如果不是,则可能表明一个错误)。

– ncoghlan
16-2-29在7:42

#2 楼

这只是一个变量名,在python中,通常将_用于一次性变量。它只是表明循环变量并未实际使用。

评论


您的意思是它不代表最后返回的值?

– alwbtc
2011年5月5日下午5:52

@steve仅在python shell中

–加比·普卡鲁(Gabi Purcaru)
2011年5月5日下午5:55

类似于在Prolog中使用_

–马特西亚斯
16-2-23在9:19

类似于在Matlab中使用〜

–PatriceG
17-4-25在13:42



请注意,在cpython shell中,如果您显式定义_,它将永久停止保存上一个表达式的输出值。这似乎非常不一致,Python lang标准需要解决这个问题。他们应该只将_定义为一个一次性名称,并阻止其用作真实标识符。

–theferrit32
4月1日18:38

#3 楼

下划线_在Python中被视为“我不在乎”或“丢弃”变量。python解释器将最后一个表达式值存储到名为_的特殊变量中。

>>> 10 
10

>>> _ 
10

>>> _ * 3 
30



下划线_也用于忽略特定值。如果不需要特定值或不使用这些值,只需将这些值分配给下划线即可。

拆包时忽略值

x, _, y = (1, 2, 3)

>>> x
1

>>> y 
3


忽略索引

for _ in range(10):     
    do_something()




评论


还有第三种用法,用于国际化功能_(“ Hello world!”)。

–杰夫·扬克(Jeff Younker)
18年3月14日在9:52

在处理器级别,“ for _ in range”和“ for x in range”之间实际有区别,然后不使用x吗?还是仅出于人类可读性?

– iammax
18年7月11日在16:42

@iammax使用dis模块,我发现字节码没有区别。但是,人类可读性的好处是显而易见的。

–阿利斯泰尔·卡斯卡登(Alistair Carscadden)
18年9月7日在8:36

#4 楼

在Python中使用下划线有5种情况。


用于将last表达式的值存储在解释器中。


用于忽略特定值。 (所谓的“我不在乎”)


为变量或函数的名称赋予特殊的含义和功能。


要用作“国际化(i18n)”或“本地化(l10n)”功能。


分隔数字文字值的数字。


这是一篇不错的文章,上面有mingrammer的示例。

评论


实际上,这是一个非常新的blog.pythonlibrary.org/2017/01/11/…

–MichaelChirico
18/09/19在15:23

数字3和5并不真正适用于此问题。 OP要求将单个下划线用作独立名称,但第3点谈到将下划线用作更大名称的一部分,第5点讨论将其用于文字而不是名称。我只是在提起任何新手感到困惑的情况。编辑答案以阐明答案可能会有所帮助。

– wjandrea
11月26日18:41

#5 楼

就Python语言而言,_没有特殊含义。与_foofoo__f_o_o_一样,它是一个有效的标识符。

_的任何特殊含义纯粹是按惯例。几种常见的情况:



不打算使用变量,但语法/语义需要名称的伪名称。

# 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模块中。当不在交互模式下时,_没有特殊含义,并且未定义。 [source]


由于查找名称的方式,除非由全局或局部_定义遮盖,否则裸露的_指的是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


注:某些外壳(例如ipython)没有分配给builtins._,而是分配了特殊情况的_


在上下文国际化和本地化中,_被用作别名用于主要翻译功能。


gettext.gettext(message)

根据当前的全局域,语言和语言环境返回消息的本地化翻译目录。在本地命名空间中,此函数通常被别名为_()(请参见下面的示例)。