20

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

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

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

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

4

5 回答 5

17

是的,这是官方的:

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不仅仅是一个变量:

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

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

于 2012-05-12T12:27:09.817 回答
6

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

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

可以在这里找到有趣的讨论以及关于SO的本地讨论。

于 2012-05-12T12:26:06.800 回答
5

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

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

handle(item)
于 2012-05-12T15:55:37.897 回答
1

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

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

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

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

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

于 2012-05-12T14:02:25.250 回答
-1

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

于 2012-05-12T12:15:22.097 回答