What is the purpose of the single underscore “_” variable in Python?
在本代码中,for后面的_的含义是什么?
1 2 3 4
| if tbh.bag:
n = 0
for _ in tbh.bag.atom_set():
n += 1 |
- 请参阅stackoverflow.com/questions/1739514/as variable name in pyth‌&8203;on
- 虽然这个问题被标记为一个副本,但它和它的答案对这个问题的讨论要比它据称重复的问题好得多。
- 对于您的情况,使用len(tbh.bag.atom_set())方法(如果返回值有__len__方法)或sum(1 for _ in tbh.bag.atom_set())方法会更干净。
- 在pylint中,虚拟变量名的另一个选项是变量名的前缀dummy_。在pylint中使用这个前缀,会使pylint不发出警告。还可以为pylint配置虚拟变量模式,以适应类似__的情况。
_在python中有3种主要的常规用途:
在交互中保存上次执行表达式(/statement)的结果口译员会议。这一先例是由标准CPython制定的。翻译和其他翻译也效仿
对于i18n中的翻译查找(请参见获得文本例如文档),如代码中所示:raise forms.ValidationError(_("Please enter a correct username"))
作为通用的"一次性"变量名,用于指示该部分函数的结果被故意忽略,例如在以下代码中:label, has_label, _ = text.partition(':')
后两个目的可能会发生冲突,因此有必要避免在任何代码块中使用_作为一次性变量,这些代码块也使用它进行i18n翻译(许多人更喜欢使用双下划线__作为一次性变量,原因正是如此)。
- 你能解释一下它在函数调用中是如何工作的吗,例如:raise forms.validationError(("请输入正确的用户名"))。我在Django代码中看到过,现在还不清楚发生了什么。
- 这就是惯例2的用法,_是用于执行国际化和本地化字符串翻译查找的函数的名称。我很肯定是C.gettext图书馆建立了这个公约。
- fwiw,我个人已经开始使用__(双下划线)作为我的通用throwaway变量,以避免与前两个用例中的任何一个冲突。
- PEP8中没有提到将单个_用作一次性变量的变量名。你知道一个权威人士建议使用它来达到这个目的吗?
- 紧急的社区公约往往没有权威的来源——只是对随着时间推移出现的实践的观察。fwiw,我是最新的pep 8更新的合著者之一,我的答案是基于我从2002年开始专业地使用python以来,看到_作为变量名的3种不同方式。
- 谢谢你的回答。无论如何,我不理解将变量标记为未使用的优点。相反,由于Python的目标之一是让代码可读,因此将下划线字符用作变量或函数名不是一个好主意。
- 约定主要用于元组解包:a, __, c = iterable立即告诉读者我们正在解包一个3元组,但只使用第一个和最后一个值。如果我们改为编写a, b, c = iterable,那么读卡器(或自动代码过梁)可以合理地期望所有a、b和c稍后都可以使用(如果没有,这可能是某个地方出现错误的迹象)。
- 基于这些评论,我现在直接在答案中添加了用法2和3的示例。
- 在这里,一个实现数字2的_的示例可能会有所帮助。或者,在另一个问题中,这个问题会得到更好的解决吗?如果是这样,我不知道怎么问这样的问题。
- @jpmc26:我添加了一个链接,指向stdlib gettex docs:docs.python.org/3/library/gettex.html本地化模块‌&8203;e(有更高级别的il8n模块,但这个特定的约定来自于c gettextAPI,python从那里采用了它)
- 它似乎也用于分隔数字中的数字?>>> 1_000_123导致1000123。
- @Miserablevariable是在3.6中添加的一个新功能,用于写入数字文本,它不涉及将_用作变量。它更接近于将其用作更大标识符的一部分,如functools.total_ordering或contextlib.redirect_stdout。
- @我对Python很陌生。我在寻找下划线含义的同时,找到了你出色的答案(我发现了一些新的东西,如何访问最后的表达式语句)。它不是一个变量,但我认为它属于(或将成为)"Python中的主要常规用法"之一。鉴于你的答案很受欢迎,我认为这将是一个很好的补充,为未来的游客。
- @Miserabablevariable是列出的第一个用例(它是一个普通变量——它只是隐式地受交互循环的约束)。不过,我已经将其更新为"expression(/statement)",而不仅仅是"statement"。
它只是一个变量名,在Python中,使用_作为一次性变量是常规的做法。它只是表示循环变量实际上没有被使用。
- 你的意思是它不代表最后一个返回值?
- @史蒂夫只有一个Python壳
- 类似于在prolog中使用
- 类似于在matlab中使用~。
下划线_在python中被认为是"i don't care"或"throwaway"变量。
- 第三种用法是国际化功能_("Hello world!")。
- 在处理器级别,"范围内"和"范围内的X"之间是否存在实际差异,然后不使用X?或者只是为了人类的可读性?
- @我发现使用dis模块的iammax在字节码方面没有区别。然而,人类可读性的好处是显而易见的。
在Python中使用下划线有5种情况。
用于在解释器中存储最后一个表达式的值。
忽略特定值。(所谓"我不在乎")。
赋予变量或函数的名称特殊的含义和功能。
用作"国际化(i18n)"或"本地化(l10n)"功能。
分隔数字文本值的位数。
这是一篇很好的文章,有明格拉默的例子。
- 谢谢你给我5个-我不知道。
- 事实上,这是一个全新的博客.pythonlibrary.org/2017/01/11/…