1. 程式人生 > >Python 函數的作用域

Python 函數的作用域

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 函數的作用域