以下代码是不好的做法吗?
for i in some_values:
do_whatever(i)
do_more_things(i)
不知何故,我觉得变量i
应该保留在 for 循环内块的范围内。但是 python 2.7 让我在循环后重用它。
python 是否正式支持该功能,还是我在滥用该语言?
以下代码是不好的做法吗?
for i in some_values:
do_whatever(i)
do_more_things(i)
不知何故,我觉得变量i
应该保留在 for 循环内块的范围内。但是 python 2.7 让我在循环后重用它。
python 是否正式支持该功能,还是我在滥用该语言?
是的,这是官方的:
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 ...:
等等。这些东西不能在循环之后简单地消失。
您可以使用此技术扫描列表以查找符合某些条件的项目:
for item in iter:
if interesting(item):
break
else:
raise ValueError('iter is boring.')
handle(item)
就像@petr 说的,这听起来不自然。不是因为它是自然的,或者你必须使用它。
我宁愿有这样的东西,尽管它可能不适用于带有break
用例的逻辑:
for i in some_values:
do_whatever(i)
else:
do_more_things(i)
NameError
但是如果some_values
评估为空,这仍然会提高,但听起来更清晰。它没有给出内部范围的清晰可读性,但缩进可能暗示了这一点。
但正如其他人所说,要回答特定的 OP 问题,是的,这是合法的。
这不是一个功能。在您编写时,变量仍保留在范围内。这是正常的解释器行为。