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()