作用域:變數起作用的範圍。注意:for,while迴圈並不會產生乙個新的命名空間。legb含**釋:
l — local(function)區域性作用域;函式內的命名空間 ,可以通過locals() 檢視。
e —enclosing function locals外部巢狀作用域;外部巢狀函式的命名空間(例如closure閉包函式)
g —global(module)全域性作用域;函式定義所在模組(.py檔案)內的命名空間,可以通過globals() 檢視。
b —builtin(python)內建模組作用域;python內建模組的命名空間(builtins.py檔案) ,可以通過 dir(builtins) 檢視。
由內到外: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函式的時候,經常會遇到很多定...