python简单变量(不考虑类变量)分为两类: 函数内定义的局部变量,和函数外定义的全局变量
基本访问规则
1. 在函数内部,可以直接
读取访问全局变量(注意只读)
#!/usr/bin/env python
i = 10
def f():
j = i + 1 # 读取全局变量i
f()
print "i=%d" % i
2. 在函数内部,如果要修改访问一个变量,那么python一定会认为这是一个局部变量(除非变量用global修饰,后面讲)
所以如果同名全局变量,python会创建一个局部变量
#!/usr/bin/env python
i = 10
def f():
i = 20 # 赋值操作, 创建一个本地变量i
f()
print "i=%d" % i
3. 在函数内部,如果修改同名全局变量之前,对变量有读取引用,那么会引发UnboundLocalError: local variable 'i' referenced before assignment错误
#!/usr/bin/env python
i = 10
def f():
j = i + 1 # 开始此行代码试图引用权变量i
i = 20 # 而此行表明i是本地变量,反推出前面一行的i应该是本地变量,但在执行前面一行时本地变量并没有创出出来,所以报错
f()
print "i=%d" % i
Traceback (most recent call last):
File "./tt.py", line 6, in <module>
f()
File "./tt.py", line 4, in f
j = i + 1
UnboundLocalError: local variable 'i' referenced before assignment
聪明的程序员马上就会思考, 会什么不让前面一行引用全局变量i,而在i=20之后的对i的引用才使用本地变量呢;技术上完全可以这么做,试想一旦这么做,导致同一个代码块里的同名变量指向的是不同的变量,其结果是代码的可读性可维护性变得极差,对后期代码的调试,BUG修正简直是个大坑。