python中的函數作用域

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章