python是否正式支持在循环后重用循环变量?

时间:2012-05-12 12:12:55

标签: python

下面的代码是不好的做法?

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

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

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

5 个答案:

答案 0 :(得分:15)

是的,这是正式的:

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 ...:

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

答案 1 :(得分:4)

如果你来自C或Java这样的语言,那么当涉及范围界定时,Python会感觉有点特别。正如之前的回答所说,代码绝对有效,但我建议反对它。它创建的代码不是特别易读,而且,如果some_values变为空,则会在代码的最后一行引发异常。

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

可以找到有趣的讨论here以及SO的本地讨论。

答案 2 :(得分:2)

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

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

handle(item)

答案 3 :(得分:1)

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

我更喜欢这样的东西,虽然它可能不适用于break用例的逻辑:

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

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

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

答案 4 :(得分:0)

这不是一个功能。在您编写时,变量仍在范围内。这是正常的翻译行为。