708

这段代码中的_after是什么意思?for

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

5 回答 5

899

_在 Python 中有 3 个主要的常规用途:

  1. 在交互式解释器会话中保存最后执行的表达式的结果(请参阅文档)。这个先例是由标准 CPython 解释器开创的,其他解释器也纷纷效仿

  2. 对于 i18n 中的翻译查找(例如,参见 gettext 文档),如代码中所示

    raise forms.ValidationError(_("Please enter a correct username"))
    
  3. 作为通用的“一次性”变量名:

    1. 表示函数结果的一部分被故意忽略(从概念上讲,它被丢弃了。),如代码所示:

      label, has_label, _ = text.partition(':')
      
    2. 作为函数定义的一部分(使用deflambda),其中签名是固定的(例如,通过回调或父类 API),但这个特定的函数实现不需要所有参数,如下代码所示:

      def callback(_):
          return True
      

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

    此用例可能与翻译查找用例发生冲突,因此有必要避免_在任何也将其用于 i18n 翻译的代码块中用作一次性变量(许多人更喜欢双下划线__, 作为他们的一次性变量这个原因)。

    Linter 通常会识别此用例。例如,如果稍后在代码中未使用,year, month, day = date()则会引发 lint 警告。day如果day确实不需要,解决方法是编写year, month, _ = date(). 与 lambda 函数相同,lambda arg: 1.0创建一个需要一个参数但不使用它的函数,它将被 lint 捕获。解决方法是编写lambda _: 1.0. 未使用的变量通常隐藏错误/错字(例如设置daydya在下一行中使用)。

    Python 3.10 中添加的模式匹配功能将这种用法从“约定”提升为“语言语法”,其中match涉及语句:在匹配情况下,_通配符模式,在这种情况下,运行时甚至不会将值绑定到符号.

    对于其他用例,请记住它_仍然是一个有效的变量名,因此仍将保持对象处于活动状态。在不希望这样做的情况下(例如释放内存或外部资源),显式del name调用将满足正在使用该名称的 linter,立即清除对对象的引用。

于 2011-05-05T07:10:47.657 回答
240

它只是一个变量名,在 python 中_用于一次性变量是常规的。它只是表示实际上并未使用循环变量。

于 2011-05-05T05:47:50.853 回答
112

下划线在 Python_中被视为“我不在乎”或“一次性”变量

  • python 解释器将最后一个表达式值存储到名为_.

    >>> 10 
    10
    
    >>> _ 
    10
    
    >>> _ * 3 
    30
    
  • 下划线_也用于忽略特定值。如果您不需要特定值或未使用这些值,只需将值分配给下划线即可。

    解包时忽略一个值

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

    忽略索引

    for _ in range(10):     
        do_something()
    
于 2017-12-01T18:46:47.823 回答
29

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

  1. 用于在解释器中存储最后一个表达式的值。

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

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

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

  5. 分隔数字文字值的数字。

是一篇不错的文章,带有mingrammer的示例。

于 2018-03-13T08:49:43.790 回答
9

就 Python 语言而言,_一般没有特殊含义。它是一个有效的标识符,就像_foo,foo__f_o_o_
唯一的例外是matchPython 3.10 之后的语句:

在语句中的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,例如ipython不分配给builtins._但 special-case _

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

    gettext.gettext(消息)

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

于 2019-11-21T11:10:48.613 回答