Python變數作用域LEGB和變數名的查詢規則

2021-09-27 04:26:24 字數 3264 閱讀 7277

作用域:變數起作用的範圍。

legb含**釋:

l — local(function)區域性作用域;函式內的命名空間 ,可以通過locals() 檢視。

e —enclosing function locals外部巢狀作用域;外部巢狀函式的命名空間(例如closure閉包函式)

g —global(module)全域性作用域;函式定義所在模組(.py檔案)內的命名空間,可以通過globals() 檢視。

b —builtin(python)內建模組作用域;python內建模組的命名空間(builtins.py檔案) ,可以通過 dir(builtins) 檢視。

注意:for,while迴圈並不會產生乙個新的命名空間。

由內到外:l -> e -> g -> b

在訪問變數時,先查詢本地變數,然後是包裹此函式外部的函式內部的變數,之後是全域性變數,最後是內建變數。

區域性變數

定義在函式內部的變數(形參也是區域性變數)

只能在函式內部使用

呼叫函式時才被建立,函式結束後自動銷毀

全域性變數

定義在函式外部,模組內部的變數。

在整個模組(py檔案)範圍內訪問(但函式內直接能讀不能將其直接賦值,需要關鍵字global先宣告可以)。

global 語句

作用:

– 在函式內部修改全域性變數。

– 在函式內部定義全域性變數(全域性宣告)。

語法

global 變數1, 變數2, …

說明

– 在函式內直接為全域性變數賦值,視為建立新的區域性變數。

– 不能先宣告區域性的變數,再用global宣告為全域性變數。

案例分析:

1, 在函式內部可以直接引用外部變數(僅讀):

a =

100def

outer()

:print

(a)if __name__ ==

"__main__"

: outer(

)# 100

2,在函式內試圖直接對乙個全域性變數賦值(直接寫),僅視為建立新的區域性變數:

a =

100def

outer()

: a =

200print

(a)# 200

if __name__ ==

"__main__"

: outer(

)print

(a)# 100

3,如果想要在函式內部引用全域性變數,可以使用global關鍵字

a =

100def

outer()

:global a

a =200print

(a)# 200

if __name__ ==

"__main__"

: outer(

)print

(a)# 200

4,在函式內部是可以用global定義新的全域性變數的:

def

outer()

:global c

c =200print

(c)# 200

if __name__ ==

"__main__"

: outer(

)print

(c)# 200

5,不能先宣告區域性的變數,後再用global宣告其為全域性變數

def

outer()

: c =

100#不能在定義乙個區域性變數之後,後用global宣告它是全域性變數

global c

c =200print

(c)# 200

if __name__ ==

"__main__"

: outer(

)print

(c)# 200

將會報錯:

global c

^syntaxerror: name 'c'

is assigned to before global declaration

作用:

在內層函式引用修改外層巢狀函式內的變數。(函式是可以巢狀的,如閉包)

語法

nonlocal 變數名1,變數名2, …

說明

在被巢狀的內函式中進行使用

不能先宣告區域性的變數,後再用nonlocal 宣告其為外部巢狀變數

案例:

在函式內部

def

outer()

: c =

200def

inner()

:nonlocal c

print

(c)# 200

return inner

if __name__ ==

"__main__"

: outer()(

)

不能先宣告區域性的變數,後再用nonlocal 宣告其為外部巢狀變數

def

outer()

: c =

200def

inner()

: c =

100#不能先宣告區域性的變數,後再用nonlocal 宣告其為外部巢狀變數

nonlocal c

print

(c)# 200

return inner

if __name__ ==

"__main__"

: outer()(

)

將會報錯:

nonlocal c

^syntaxerror: name 'c'

is assigned to before nonlocal declaration

python 變數作用域 LEGB

l local 區域性作用域 區域性變數 包含在def關鍵字定義的語句塊中,即在函式中定義的變數。每當函式被呼叫時都會建立乙個新的區域性作用域。e enclosing 巢狀作用域或稱為閉包作用域 e也包含在def關鍵字中,e和l是相對的,e相對於更上層的函式而言也是l。與l的區別在於,對乙個函式而言...

Python 17 變數作用域LEGB(作用域鏈)

python中的 legb 作用域鏈 l 區域性變數 local e 外層函式 閉包空間 enclosing function g 全域性變數 global b 內建模組 builtins 當找乙個變數時,現在 local 找,即先找本函式內的變數,若找到則結束 否則,找閉包空間,即外層函式,從內向...

詳解Python函式作用域的LEGB順序

1.什麼是legb?l local 函式內部作用域 e enclosing 函式內部與內嵌函式之間 g global 全域性作用域 b build in 內建作用域 2.legb是作什麼用的?為什麼非要介紹這個呢?或者說它們的作用是什麼?原因是因為我們的在學習python函式的時候,經常會遇到很多定...