一般规则
1定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是被定义为局部变量
2.函数内部的变量名如果是第一次出现,且出现在=符号后面,且在之前已被定义为全局变量
3.函数中使用某个变量时,如果该变量名既有全局变量也有局部变量,则默认使用局部变量
4.在函数中将某个变量定义为全局变量时需要使用关键字global
坑1
这样会报错。因为在函数内部已经重新定义var。不过在之前引用是引用不到的。
var = 1
def fun():
print var
var = 200
print fun()
变量作用域
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
Python除了def/class/lambda 外,其他如: if/elif/else/ try/except for/while并不能改变其作用域。定义在if里面的变量外部依然能访问
闭包Closure
闭包的定义:如果在一个内部函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
闭包变量的值是执行的时候。外面函数的值
globals() 和 locals() 提供了基于字典的访问全局和局部变量的方式
globals()[‘var’]
locals()两个东西能把局部变量直接传出去。很猛的方法