【问题标题】:Does python officially support reusing a loop-variable after the loop?python 是否正式支持在循环后重用循环变量?
【发布时间】:2012-05-20 18:33:54
【问题描述】:

以下代码是不好的做法吗?

for i in some_values:
    do_whatever(i)
do_more_things(i)

不知何故,我觉得变量 i 应该保留在 for 循环内块的范围内。但是 python 2.7 让我可以在循环之后重用它。

python 是否正式支持该功能,还是我在滥用该语言?

【问题讨论】:

  • hmmm... 看起来这可能没问题,因为它被使用了here
  • 有相当多的用例受益于在后续代码中访问循环变量的最后一个值

标签: python


【解决方案1】:

是的,这是官方的:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

> The target list is not deleted when the loop is finished 

http://docs.python.org/reference/compound_stmts.html#for

请注意,for 之后的 target list 不仅仅是一个变量:

for some_list[blah] in...
for some_object.foo in...
for a[:n] in ...:

等等。这些东西在循环之后不能简单地消失。

【讨论】:

    【解决方案2】:

    如果您来自 C 或 Java 等语言,那么在范围界定方面,Python 会感觉有点特别。正如前面的回答所说,代码绝对有效,但我建议不要这样做。它会创建不特别可读的代码,此外,如果 some_values 为空,则代码的最后一行会引发异常。

    所以对你的问题的回答是 - 是的,它是官方支持的,但在大多数情况下,它不是推荐的策略。

    可以在here 找到有趣的讨论,也可以在SO 找到本地讨论。

    【讨论】:

    • 谁不推荐呢?以及为什么它会使代码难以阅读 - python 变量存在于它们的整个范围内,但是它们是被引入的。
    • 我同意。只是感觉“脏”。
    • 首先,我相信它假设循环已运行并且变量确实已分配。其次,当以第三人称阅读本文时,我会假设在相同/较低缩进上定义的变量。但是python社区在这一点上存在分歧。
    • “我会假设在相同/更低缩进上定义的变量”你为什么会假设?
    • @Marcin 对不起-我不能引用任何规则。这源于我的个人经历。正如我已经澄清的那样 - python 社区对此有点分歧,我会支持有自己范围的循环。但我想我可能是少数派:)
    【解决方案3】:

    您可以使用此技术扫描列表以查找符合某些条件的项目:

    for item in iter:
        if interesting(item):
            break
    else:
        raise ValueError('iter is boring.')
    
    handle(item)
    

    【讨论】:

      【解决方案4】:

      就像@petr 说的,这听起来很不自然。不是因为它是自然的,或者你必须使用它。

      我宁愿有这样的东西,尽管它可能不适用于 break 用例的逻辑:

      for i in some_values:
          do_whatever(i)
      else:
          do_more_things(i)

      但是如果some_values 评估为空,这仍然会引发NameError,但听起来更清晰。它没有给出内部范围的清晰可读性,但缩进可能暗示了这一点。

      但正如其他人所说,要回答特定 OP 的问题,是的,这是合法的。

      【讨论】:

        【解决方案5】:

        这不是一个功能。在您编写时,变量仍保留在范围内。这是正常的解释器行为。

        【讨论】:

        • 嗯,我对此投了反对票,因为“这不是一个功能”似乎与最佳答案直接矛盾,但现在重新阅读我认为您的意思是“这不是i 仅持续的功能对于循环范围”,这是真的。不过,我将把反对票留在那里,因为我认为您的措辞不清楚,而我最初的解释是更自然的解释(而且是错误的)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-20
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多