您現在的位置是:首頁 > 寵物首頁寵物

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

由 碼不完的程式碼 發表于 寵物2023-01-07
簡介LEGB規定了查詢的順序為:local>enclosing function locals>global>builtin3、運用例項:1、LG變數命名例項:在函式外面訪問函式內的變數:發現變數並沒有被定義

global在python是什麼意思

Python學習中,有時候在命名變數名和訪問變數名時總有混亂,於是,我便好好捋一下變數作用域的規則。

1、變數作用域:

識別符號的作用域是定義為其宣告在程式裡的可應用範圍, 或者即是我們所說的變數可見性。換句話說,就是你可以在程式裡的哪些部分去訪問一個變數。變數可以是區域性域或者全域性域。

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

名稱空間:

python的名稱空間

是對變數名的分組劃分。

不同組的相同名稱的變數視為兩個獨立的變數,因此隸屬於不同分組(即名稱空間)的變數名可以重複。所以python的區域性變數名稱可以和全域性變數名稱重複。

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

變數可以在三個地方分配,對應三個不同作用域:

1、 在def內賦值,則是函式之內的區域性變數,只在函式內有效。

2、 若變數在巢狀def中賦值,則對於巢狀函式來說,變數不是本地的。

3、 在def之外宣告的變數,則是全域性變數。

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

2、變數名解析的LEGB原則:

首先解釋LEGB:

L是local,

指區域性變數,作用於函式內部。

E是Enclosing function locals

可能是巢狀函式內,比如python巢狀函式。這個涉及到了函式的閉包,下一篇我再介紹。

G是Global

,是全域性變數,定義在函式體外,在整個檔案中都可以訪問。

B是Buildin,

Python內建模組的名字空間函式名稱等,比如dict、len()等。

Python的名稱空間實際是一個字典,字典內儲存了變數名稱與物件之間的對映關係,因此,查詢變數名就是在名稱空間字典中查詢鍵-值對。

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

Python有多個名稱空間,因此,需要有規則來規定,按照怎樣的順序來查詢名稱空間,LEGB就是用來規定名稱空間查詢順序的規則。LEGB規定了查詢的順序為:local>enclosing function locals>global>builtin

3、運用例項:

1、LG

變數命名例項:

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

在函式外面訪問函式內的變數:發現變數並沒有被定義。

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

2、LEG查詢,

請看下面程式碼以及輸出結果

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

解釋一下:上面總共在三個位置都給一個同一個變數名稱賦值,但是我們是在最裡面的一個函式訪問的那個變數,當inner函式要列印a_var變數的時候,它便按照LEGB的順序查詢這個變數,所以便輸出了‘本地變數’。

3、

Built-in

在python中,我們可以直接檢視內建變數,如下;顯示一部分

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

例項:

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

在這裡我們定義了一個自己的len函式,當我們呼叫len的時候,按照LEGB順序,是呼叫我們自己宣告的函式,而不是內建函式。

4、global訪問修改全域性變數

正常情況下我們在函式內訪問全域性變數,只能對其訪問,而不能修改,這時,利用

global宣告

我們就可以修改全域性變數。

例項:

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

注意

不建議在函式內直接修改全域性變數,容易造成混亂

,因為這經常造成混亂或者很難除錯的奇怪錯誤。如果你想要透過一個函式來修改一個全域性變數,建議把它作為一個變數傳入,然後重新指定返回值。

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句

碼字不易,多多關照,謝謝。

乾貨!Python入門基礎之變數作用域、LEGB原則以及global語句