运行代码的时候有一个值的输出一直不是我想要的,经过一番检查之后发现,问题出在两层for循环用了同名的循环变量,最后输出的就是这个循环变量,由于里层for循环改变了循环变量的值,导致最后输出结果不正确。
出错的代码如下:
def test(shotnum,time):
# 测试输出
for i in shotnum:#shotnum=[112984,112985,112986,112988,112995]
'''
***********************
*******很多行代码*******
***********************
'''
a = id.count(0) # 统计"0"的个数
for i in range(a): # 控制循环次数
id.remove(0) # remove方法删除"0",获得新id
if max(set(id), key=id.count) == 1: # 获得输出中出现次数最多的类型
print(i, ': N=1 t mode')
elif max(set(id), key=id.count) == 2:
print(i, ': N=2 t mode')
elif max(set(id), key=id.count) == 3:
print(i, ': N=1 fb')
'''
***********************
*******很多行代码*******
***********************
'''
我以为里层for循环的循环变量的作用范围只在里层for循环,循环变量在里层for循环被从0开始赋值,循环结束后对外层for循环的循环变量不构成影响。
但实际是里层for循环的循环变量确实是从0开始被赋值*(循环变量i在进入里层for循环之前的值是112984,a的值是4924,如果里层for循环的循环变量直接使用外层for循环的循环变量的值,这个for循环根本不会执行,但是里层for循环完完整整地被执行了,说明里层for循环的循环变量的值并不是外层for循环的循环变量的值,后来我对代码进行了调试,调试结果也证明里层for循环的循环变量是从0开始被重新赋值的)*,但是最后一次循环后,循环变量获得的值,在出了里层for循环之后,被赋给了外层for循环的循环变量。
经过查找资料之后了解到这是因为外层循环变量 和 里层循环变量是处于一个作用域, 都是模块级别的变量。 所以都在模块级别的变量,不能重复。
解决方法是修改循环变量的名称,里层变量不要和外层变量名一样,这样两个变量名称,就不会冲突了,结果正确输出。
积累到知识了,记录一下