python函数作用域
在python程序中创建,改变,查找变量名时,都是在一个保存变量名的空间中进行,而这个空间被称为作用域。
查找变量的顺序是:局部作用域—>嵌套作用域—>全局作用域—>内置作用域 (LEGB)
加载变量的顺序是:内置作用域—>全局作用域—>嵌套作用域—>局部作用域(BGEL)
思考:python在情况下可以正常输出i的值?
#案例1 if True: i=0 print(i) #案例2: for i in range(10): i=i+1 print(i) #案例3 def fun(): i=1 print(i)
1,2均可。因为python与其他语言的差异,并不会对if和for的代码块引入作用域。
python在什么情况下会引入新作用域:模块,类,函数。
局部作用域
1,概念
L:local,局部作用域,函数中定义的变量。
2,代码示例
def fun(): a=123 #函数内a的赋值就是局部作用域local
嵌套作用域
1,概念
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的作用域,但不是全局作用域,常见于闭包。
2,代码示例
def funf(): a=123 #函数funf的局部作用域,函数funs的嵌套作用域 def funs(): a=456 #函数funs的局部作用域
全局作用域
1,概念
G:globa,全局变量,是模块级别定义的变量。
2,代码示例
a=789 #在模块内直接赋值,即为此模块的全局作用域
内置作用域
1,概念
B:bulit-in,系统固定模块里的变量,在内置空间中定义,例如:int(),len(),print()等
2,代码示例
a=int("123") #int函数位于内置作用域
修改变量的两个关键字
global
1,作用
对全局变量进行修改
2,代码
test=520 #定义全局变量test def fun(): global test #用global关键字声明这是全局变量,可对其进行修改 print(test) test+=1 #修改全局变量 fun() print(test)
nonlocal
1,作用
对嵌套作用域的变量进行修改
2,代码
def funf(): f=123 #函数funf的局部作用域,函数funs的嵌套作用域 def funs(): nonlocal f #利用nonlocal关键字声明引用函数funs的嵌套变量,可对其进行修改 print(f) f+=1 #修改嵌套变量 funs() print(f) funf()