在Python中循环后读取循环变量是可靠的

时间:2016-03-07 04:17:04

标签: python

循环后读取循环变量是否安全(使用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?

2 个答案:

答案 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的新变量,而不依赖于循环变量。