Python:變數的作用域與LEGB原則
阿新 • • 發佈:2021-01-16
技術標籤:Python
文章目錄
函式是Python中的第一類物件 ,可以把函式賦值給變數,對該變數進行呼叫,可實現原函式的功能。
(變數——函式——函數語言程式設計)
1. 作用域 / 名稱空間
1.1 作用域的定義
作用域:程式建立、訪問、改變一個變數時,都是在一個儲存該變數的空間內進行,這個空間為名稱空間,即作用域。
python作用域是靜態的,變數被賦值、建立的位置決定了其被訪問的範圍,即變數作用域由其所在位置決定。
1.2 作用域的前提
Python中,作用域的概念僅僅存在 於:當變數在Module(模組)、Class(類)、def(函式) 中定義的時候
理解這一點至關重要! 對於LEGB原則
準確、快速的理解很有幫助。
再說的直白點,作用域存在於 def和 class之內的縮排程式碼塊 .py字尾Python檔案中!
2. LEGB 原則
Python 的變數名解析機制也稱為 LEGB 法則:
- local(本地):理解為
function
,即作用域為函式內部 - Enclosed(巢狀)理解為
Enclosing function locals
,即作用域為外部巢狀函式 - Global(全域性):理解為
module
,即作用域為模組 - Built-in(內建):即作用域為
Python內建模組
注: 我們平時所說的”區域性變數“應該是包括這裡對的local和enclosed,即相對於全域性變數的說法(個人想法)
- LEGB的作用——規定作用域的查詢順序:
local
—>enclosing function locals
—>global
—>builtin
Python 的變數名解析機制也稱為 LEGB 法則,具體如下: 當在函式中使用未確定的變數名時,Python 搜尋 4 個作用域:本地作用域(L),之後是上一層巢狀結構中 def 或 lambda 的本地作用域(E),之後是全域性作用域(G),最後是內建作用域(B)。按這個查詢原則,在第一處找到的地方停止。如果沒有找到,Python會報錯的。
3. 例項
-
全域性
# Global s = 'Robin' def f1(): print(s) def f2(): s = 'pbb' f1() f1()
結果是全域性變數
Robin
-
巢狀
# Enclosed s = 'Robin' def f1(): s = 'pbb' def f2(): print(s) return f2() f1()
結果是內部函式f2的區域性引數
pbb
,而不是全域性引數Robin
-
本地
# Local def f1(): s = 'Robin' print(s) def f2(): s = 'pbb' f1() f1()
結果:
Robin
-
內建模組
# Built-in import math # 引入了內建模組 pi = math.pi # 可以直接使用math這個指向內建模組的變數 print(pi)
這一塊也可以先參考之前的記錄,以後有空再對”變數“這個東西做一個總結