Python中使用下划线作为循环变量是否可接受?

5
根据官方Python教程,在交互模式下,最后一个打印的表达式会被赋值给变量“_”。这意味着当您将Python用作桌面计算器时,继续计算会更加容易,例如:
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06

这个变量应该被视为用户只读。不要显式地给它分配一个值,否则你将创建一个独立的局部变量,其名称掩盖了带有魔术行为的内置变量。

这里没有任何混淆。

然后我看到一些人将_用作循环变量。例如,根据这篇博客文章:

_被用作丢弃的名称。这将使下一个阅读您代码的人知道,按照惯例,某个名称被分配但不打算使用。例如,您可能对循环计数器的实际值不感兴趣:

n = 42
for _ in range(n):
    do_something()

这是一个好的规范吗?我在解释器中验证,使用_在循环中屏蔽了后面的内置变量。但是当它在脚本中使用时(即不在交互模式下),将其用作循环变量是否可以?


2
如果您的目的是执行块“n”次并且不需要烦恼或使用循环变量,那么这样做就可以了。 - Austin
1
@Austin 请把它作为答案发布。 - Marat
@Marat:我不确定这是否是一个好的规定,但知道这是可能的(所以不值得回答)。 - Austin
1
@Austin 这些问题在动态中看起来好像没有被回答。无论答案有多简单,最好还是明确地将问题标记为已回答。 - Marat
1个回答

1
作为 Python 中长期惯例的一部分,下划线(_)被用作开发者仅为满足语法要求而使用的名称。在许多编程语言中,单个字符的变量经常与一次性名称相关联。
当这种用法清楚地表明存储在此变量中的返回值不重要时,这种用法是可接受的。

在交互模式下

正如您所注意到的,Python解释器中_的含义类似于典型现代计算器设置中的Ans。当您将_用作变量名时,该功能被覆盖。尽管如此,它是可逆的,在交互模式下执行代码后:

n = 42
for _ in range(n):
    do_something()
你可以使用del将这个变量从全局名称池中删除(只要它没有在其他地方被引用)。
del _

_的值将再次反映上一次的返回值。


特殊情况

在国际化和本地化中,有其他被认可的使用下划线(_)名称的方式。

名称 _ 被用作 gettext 模块中最常用的两个函数 gettext.gettextgettext.gettext_lazy 的别名。这种用法由 Django 框架普及化,该框架在其内部的 utils 包中使用该库。例如,当需要翻译字符串 'abc' 时,根据此约定,应按以下方式引用:

from django.utils.translation import gettext as _
# ...
_('abc')  # this string would be translated

由于这个原因,一些Python人物(例如Kenneth Reitz)推广使用__(双下划线)而不是_(单下划线)作为一个被丢弃的变量,尽管其他社区成员并不太赞同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接