偶然掉进了一个坑里。仔细分析了下原因。原来是变量作用域的问题。简单抽象如下:
id=1
#许多行代码
[id for id in range(10)]
#许多行代码 if id!=1:
#做一些事情
pass
else:
#做另外一些事情
结果由于id在
[id for id in range(10)]
中受到了影响发生了变化,导致虫虫的产生。
索性探索了下变量作用域,结论如下:
1. 函数中的同名变量不会影响函数外的同名变量(若未加任何修饰--比如global)
id=1
def test():
id=2 print id
#===1
2. 变量的最小作用域是一个函数。在函数内部,变量的作用是从始至终的。(这不同于其他语言)
id = 1
if True:
id=2 print id
#===2 id = 1
for i in range(10):
id=i
print i
#====9
同样下面的也是ok的:
if True:
b=1
print b
输出1,不会因为b在if/for/while下面而成为一个局部的临时代码块变量!
变量的最小作用范围是函数,甚至极端点,下面的也是输出1的:
for i in range(10):
for j in range(2):
if True:
if True:
if True:
c=1 print c