local variable 'xxx' referenced before assignment----引申python作用域

    在学习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

       这里需要大家注意的是,即时变量名相同,但是处于不同的作用域,其意义也不相同。当函数执行出现变量时,查询顺序是本地-->函数-->全局-->内置函数,所以脚本中一旦设置全局变量后,函数中出现相同的变量名,是可以引用到这个变量的。但是一旦改动变量,就会将此变量的作用域转为本地,然后既然是本地变量,在函数中有没有初始化,所以会出现报错!

       


你可能感兴趣的:(local,number,BEFORE,recent)