下面的代码是不好的做法?
for i in some_values:
do_whatever(i)
do_more_things(i)
不知何故,我觉得变量i
应该保留在for循环内的块的范围内。但是python 2.7允许我在循环之后重用它。
python是否正式支持该功能,还是我滥用该语言?
答案 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
变为空,则会在代码的最后一行引发异常。
所以回答你的问题是 - 是的,它是官方支持的,但在大多数情况下,它不是推荐的策略。
答案 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)
这不是一个功能。在您编写时,变量仍在范围内。这是正常的翻译行为。