在学习python线程是遇到的小问题,函数外面定义的变量,如果在函数内去调用并改变这个变量就是会出现: local variable 'xxx' referenced before assignment
代码示例如下(demo1):
#!/usr/bin/env python number = 0 def run(): number += 1 print number run()
执行结果:
# python demo.py Traceback (most recent call last): File "demo.py", line 10, in <module> run() File "demo.py", line 6, in run number += 1 UnboundLocalError: local variable 'number' referenced before assignment
如果在函数内不改变全局变量,只是调用这个变量(demo2):
#!/usr/bin/env python number = 0 def run(): #number += 1 print number run()
执行结果:
# python demo.py 0
demo1的错误意思是变量number没有定义,但是第2行代码不是定义了一个全局变量number么,而且根据demo2,只要不改变number就没有问题,那么这个是不是python的规则问题?
对比shell脚本:
#!/bin/sh number=0 run(){ number=$(($number + 1)) echo $number } run
执行结果
1
shell中函数内部调用并改变全局变量没有任何问题,那么为什么在python中不行?
原来在python的函数中和全局同名的变量,如果你有修改变量的值就会变成局部变量,在修改之前对该变量的引用自然就会出现没定义这样的错误了,如果确定要引用全局变量,并且要对它修改,必须加上global关键字
解决办法:
#!/usr/bin/env python number = 0 def run(): global number number += 1 print number run()
执行结果:
1
这里需要大家注意的是,即时变量名相同,但是处于不同的作用域,其意义也不相同。当函数执行出现变量时,查询顺序是本地-->函数-->全局-->内置函数,所以脚本中一旦设置全局变量后,函数中出现相同的变量名,是可以引用到这个变量的。但是一旦改动变量,就会将此变量的作用域转为本地,然后既然是本地变量,在函数中有没有初始化,所以会出现报错!