运行代码的时候有一个值的输出一直不是我想要的,经过一番检查之后发现,问题出在两层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循环的循环变量。

经过查找资料之后了解到这是因为外层循环变量 和 里层循环变量是处于一个作用域, 都是模块级别的变量。 所以都在模块级别的变量,不能重复。

解决方法是修改循环变量的名称,里层变量不要和外层变量名一样,这样两个变量名称,就不会冲突了,结果正确输出。

积累到知识了,记录一下