python中的作用域有4種: | 名稱 | 介紹 | | | | | L | local,局部作用域,函數中定義的變數; | | E | enclosing,嵌套的父級函數的局部作用域,即包含此函數的上級函數的局部作用域,但不是全局的; | | B | globa,全局變數,就是模塊級別定義的變數 ...
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 關鍵字。