Python 函數的作用域
阿新 • • 發佈:2018-04-06
byte 外部 ade code 運行 osi 直接 tab 內部
python中的作用域有4種:
名稱 | 介紹 |
---|---|
L | local,局部作用域,函數中定義的變量; |
E | enclosing,嵌套的父級函數的局部作用域,即包含此函數的上級函數的局部作用域,但不是全局的; |
B | globa,全局變量,就是模塊級別定義的變量; |
G | built-in,系統固定模塊裏面的變量,比如int, bytearray等。 |
搜索變量的優先級順序依次是(LEGB):
作用域局部 > 外層作用域 > 當前模塊中的全局 > python內置作用域。
number = 10 # number 是全局變量,作用域在整個程序中 def test(): print(number) a = 8 # a 是局部變量,作用域在 test 函數內 print(a) test() 運行結果: 10 8
def outer():
o_num = 1 # enclosing
i_num = 2 # enclosing
def inner():
i_num = 8 # local
print(i_num) # local 變量優先
print(o_num)
inner()
outer()
運行結果:
8
1
num = 1 def add(): num += 1 print(num) add() 運行結果: UnboundLocalError: local variable ‘num‘ referenced before assignment
如果想在函數中修改全局變量,需要在函數內部在變量前加上 global 關鍵字
num = 1 # global 變量
def add():
global num # 加上 global 關鍵字
num += 1
print(num)
add()
運行結果:
2
同理,如果希望在內層函數中修改外層的 enclosing 變量,需要加上 nonlocal 關鍵字
def outer(): num = 1 # enclosing 變量 def inner(): nonlocal num # 加上 nonlocal 關鍵字 num = 2 print(num) inner() print(num) outer() 運行結果: 2 2
另外我們需要註意的是:
1.只有模塊、類、及函數才能引入新作用域;
2.對於一個變量,內部作用域先聲明就會覆蓋外部變量,不聲明直接使用,就會使用外部作用域的變量(這時只能查看,無法修改);
3.如果內部作用域要修改外部作用域變量的值時, 全局變量要使用 global 關鍵字,嵌套作用域變量要使用 nonlocal 關鍵字。
Python 函數的作用域