双下划线__相比单下划线_更适合用作虚拟变量吗?

3 投票
2 回答
762 浏览
提问于 2025-04-18 14:57

我有一个在Python 2.7中的例子,需要一个临时变量。我发现很多资料推荐使用一个单独的_,就像下面这个例子:

 directory = {key: [0 for _ in range(catnum)] for key in register}

我找到这个链接:http://docs.python-guide.org/en/latest/writing/style/#create-an-ignored-variable

这里是上面网址中的一段引用:

注意: 很多Python的风格指南推荐使用单个下划线_作为临时变量,而不是这里推荐的双下划线__。问题是,_通常用作gettext()函数的别名,并且在交互式提示符中用来保存最后一次操作的值。使用双下划线则同样清晰,几乎同样方便,并且避免了意外干扰这两种其他用法的风险。

我刚开始学习Python,想知道__是否是被接受的惯例?有什么例子说明使用_会导致问题吗?

directory = {key: [0 for __ in range(catnum)] for key in blasts}

2 个回答

2

根据我所看到的,现在大多数Python程序还是用_作为一个占位符变量,而不是用双下划线__

不过,这里有一个可能会让人困惑的例子,正好在你提问的引用部分中描述了:

>>> 1+1
2
>>> _
2
>>> 
4

这段话告诉我们,使用 _ 可能会出问题的地方主要是在交互式解释器中,以及在任何把它当作 gettext.gettext 别名的代码中。这种情况在想要本地化文本的应用程序中很常见。这里有关于 gettext.gettext 的说明(我强调的部分):

根据当前的全局域、语言和区域目录,返回消息的本地化翻译。这个函数通常在本地命名空间中别名为 _()。

大多数程序像这样使用 gettext.gettext

import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print _('This is a translatable string.')

这样你就不需要在每次想要翻译字符串的时候都输入 gettext 了。

不过,话说回来,我看到的 for _ in range(catnum)for __ in range(catnum) 多得多。我想你应该知道使用 _ 会不会造成问题;要么你知道自己在使用解释器,要么你知道你的应用程序把 _ 当作 gettext.gettext 的别名。不过,使用 __ 绝对更安全。

如果让我猜为什么大家不太使用 __,我觉得可能是因为人们对 __ 有些抵触,因为双下划线通常和 Python 的名字重整“私有”变量有关,而社区普遍认为这些变量是不必要的。不过这只是我的猜测。

撰写回答