python中的函數作用域


1.作用域的介紹:#也叫名稱空間

全局名稱空間:創建的儲存"變量名與值的關系"的空間叫做全局名稱空間 # 

局部名稱空間:在函數的運行中開辟出來的空間叫做局部名稱空間 #並非單指函數,例如在模塊中,在類中的簡單賦值操作都是局部作用域

內置名稱空間:內置名稱空間中存放了python解釋器為我們儲存的的函數,例如len(),print(),list()...都是python為我們創建好的內置函數。

 

python中的作用域分4中情況:

* L : local,局部作用域,函數中定義的變量

* E : enclosing,嵌套的父級函數的局部作用域,即包含此函數的上級函數的局部作用域,但不是全局的(閉包常見)

* G : globa,全局變量,是模塊級別定義的變量

* B : bulit-in,系統固定模塊里的變量,就是內置空間定義的 int(),print(),list()

加載變量的優先級順序依次是:python內置作用域>當前模塊中的全局(文件從上而下讀取)>外層作用域>局部作用域

搜索變量的優先級順序依次是:作用域局部>外層作用域>當前模塊中的全局>python內置作用域,也就是LEJB

local 和 enciosing 是相對的,enclosing 變量相對上層來說也是 local

內置作用域

x = int(2.9)# int就是內置作用域。(bulit-in)

 

全局作用域

name = "mike"  變量賦值時的name就是全局變量(globa)

 

 

局部作用域

def numbers():
        number=10 # 函數內的number的賦值就是局部作用域(local) 

 

 

嵌套的子級局部作用域

def  numbers():
      number=10#局部作用域
def in_numbers(): in_number=20 # 子級局部作用域

 

 

 

搜索變量的優先級:

first1 = 2#全局變量

def numbers():
    first1=10#局部變量
    
        def in_numbers():
        second = 20#嵌套的局部變量
        print(first1)

    in_numbers()
numbers()

#執行結果
10

#我定義了兩個first1變量,一個是全局變量first1 = 2,一個是局部變量first1=10
#但是當我在使用嵌套的函數中打印變量名為first1時,打印的是10,而不是2,說明執行的結果為內部向外部一步步的進行搜索
#嵌套函數in_numbers首先向內部搜索,沒有搜索到,然后開始向外部函數搜索,搜索到結果后立即返回

搜索變量時只能內部向外部進行搜索,而不能外層向內層搜索,除非先聲明這個變量的歸屬。

 

作用域的產生:

在Python中,只有模塊(module),類(class)以及函數(def、lambda)才會引入新的作用域,其它的代碼塊(如if、try、for等)是不會引入新的作用域的

例0:

>>>if 10>9:
>>>    x=1
>>>print(x)#可正常執行
1

例1:

>>>def number():
>>>    x=1
>>>print(x)

    print(x)
NameError: name 'x' is not defined    #python為我們指出了錯誤代碼表示找不到x,因為我們知道,在全局環境中無法進行搜索局部環境的

 

變量的修改:

錯誤聲明:

x=6
def f2():
    print(x)#打印
    x=5
f2()

#開始我認為是因為已經尋找了全局變量x的賦值,因為x已經加載至局部函數中,我企圖在局部修改全局變量才會報錯
#實驗后發現應該是因為已經加載了內部函數,python發現了先引用后聲明的行為而導致的報錯
#測試方法為:當注釋掉x=5時該程序可正常運行,尋找到了全局變量x=6,說明x=5和報錯有着直接關系,但是還存在一種可能,當打印x時調用了全局變量x,下面的程序對全局變量進行修改,導致的報錯。但是在代碼print(x)后面加上代碼return直接返回時,依舊會報錯,說明了這個函數程序並非一步步執行的,而是先加載函數后執行。
def f2():
    x+=1
#這里的錯誤就是因為局部變量想要修改全局變量導致的報錯

global關鍵字:

使用global關鍵字時可以幫助你在局部中修改全局變量

 

count = 10
def outer():
    global count#聲明這是全局變量,可對全局變量進行修改
    print(count) 
    count = 100
    print(count)
outer()
#10
#100
# global 能少用就少用,因為會對全局變量做出修改,影響全局其他地方用這個全局變量

 

nonlocal關鍵字:

當在嵌套局部作用域上時,想要對局部作用域進行修改時,可以使用弄nonlocal關鍵字,global關鍵字只能在基於外部為全局變量是進行聲明,而nonlocal可以在嵌套的局部中進行聲明

def function1():
    number = 200 #局部作用域
    
    def in_function1():
        nonlocal number#聲明這是引用外部的局部作用域
        number = 100#更改外部的局部作用域
        print(number)
        
    in_function1()
    print(number)
function1()
#100
#100

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM