循环后读取循环变量是否安全(使用Python 2)?我的目的是检查循环中的迭代次数。
以下代码显示了这个想法:
a=[1,2,3,4,5]
for i in range(len(a)):
if a[i] == 2:
break
print i # output is 1, is it safe to read i here?
答案 0 :(得分:1)
是的,可以在那里阅读。这是因为当您在内部创建for
循环时,它有一种机制为您创建 indexer
(在您的情况下为i
)然后通过每次为其分配新值来逐一增加它。因此,您可以在i
循环后使用for
。因此:
a=[1,2,3,4,5]
for i in range(len(a)):
if a[i] == 2:
break
i
并没有真正掉线。要删除i
,您可以使用del
关键字:
a=[1,2,3,4,5]
for i in range(len(a)):
if a[i] == 2:
break
del i #deleted here
print i # now this will give you error!
要替换是,您只需要重新定义它:
a=[1,2,3,4,5]
for i in range(len(a)):
if a[i] == 2:
break
i = [] #now this is a list, not an integer anymore
print i # now this will give you different result: []
同样,例如,如果在if块中创建列表:
if i == 0: #suppose you really enter this block
a = [] #a is created here
a.append(b) #but a can be used here, assuming the previous if is really entered
这就是Python的工作方式。
一些相关帖子:
答案 1 :(得分:1)
你可以这样做,并且可以这样做,因为在这种情况下i
的值仅在执行内部循环之前递增。它会使这段代码更难阅读,但它可以完成工作。变量i
在与for循环相同的范围内创建。如果您提供的示例代码是整个文件,那么当文件存在时,i
将超出范围。如果您给出的代码示例位于函数内部,则会在函数内部创建i
,然后在函数返回/退出时超出范围。
另一种方法是在Python中使用for... in
构造for循环以及zip
方法,并保留变量:
for element, i in zip(a, range(len(a)):
if element == 2:
index = i
然后在结束时,您正在设置一个名为index
的新变量,而不依赖于循环变量。