local variable 'xxx' referenced before assignment----引申python作用域
在学习python线程是遇到的小问题,函数外面定义的变量,如果在函数内去调用并改变这个变量就是会出现:local variable 'xxx' referenced before assignment代码示例如下(demo1):#!/usr/bin/envpythonnumber=0defrun():number+=1print...
在学习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
这里需要大家注意的是,即时变量名相同,但是处于不同的作用域,其意义也不相同。当函数执行出现变量时,查询顺序是本地-->函数-->全局-->内置函数,所以脚本中一旦设置全局变量后,函数中出现相同的变量名,是可以引用到这个变量的。但是一旦改动变量,就会将此变量的作用域转为本地,然后既然是本地变量,在函数中有没有初始化,所以会出现报错!
更多推荐
所有评论(0)