作用域LEGB
作用域:變量起作用的范圍。
LEGB含義解釋:
L — Local(function)局部作用域;函數(shù)內(nèi)的命名空間 ,可以通過locals() 查看。
E —Enclosing function locals外部嵌套作用域;外部嵌套函數(shù)的命名空間(例如closure閉包函數(shù))
G —Global(module)全局作用域;函數(shù)定義所在模塊(.py文件)內(nèi)的命名空間,可以通過globals() 查看。
B —Builtin(Python)內(nèi)置模塊作用域;Python內(nèi)置模塊的命名空間(builtins.py文件) ,可以通過 dir( builtins ) 查看。
注意:for,while循環(huán)并不會(huì)產(chǎn)生一個(gè)新的命名空間。
變量名的查找規(guī)則
由內(nèi)到外:L -> E -> G -> B
在訪問變量時(shí),先查找本地變量,然后是包裹此函數(shù)外部的函數(shù)內(nèi)部的變量,之后是全局變量,最后是內(nèi)置變量。
局部變量
定義在函數(shù)內(nèi)部的變量(形參也是局部變量)
只能在函數(shù)內(nèi)部使用
調(diào)用函數(shù)時(shí)才被創(chuàng)建,函數(shù)結(jié)束后自動(dòng)銷毀
全局變量
定義在函數(shù)外部,模塊內(nèi)部的變量。
在整個(gè)模塊(py文件)范圍內(nèi)訪問(但函數(shù)內(nèi)直接能讀不能將其直接賦值,需要關(guān)鍵字global先聲明可以)。
global的使用
global 語句
作用:
– 在函數(shù)內(nèi)部修改全局變量。
– 在函數(shù)內(nèi)部定義全局變量(全局聲明)。
語法
global 變量1, 變量2, …
說明
– 在函數(shù)內(nèi)直接為全局變量賦值,視為創(chuàng)建新的局部變量。
– 不能先聲明局部的變量,再用global聲明為全局變量。
案例分析:
1, 在函數(shù)內(nèi)部可以直接引用外部變量(僅讀):
a
=
100
def
outer
(
)
:
print
(
a
)
if
__name__
==
"__main__"
:
outer
(
)
# 100
2,在函數(shù)內(nèi)試圖直接對(duì)一個(gè)全局變量賦值(直接寫),僅視為創(chuàng)建新的局部變量:
a
=
100
def
outer
(
)
:
a
=
200
print
(
a
)
# 200
if
__name__
==
"__main__"
:
outer
(
)
print
(
a
)
# 100
3,如果想要在函數(shù)內(nèi)部引用全局變量,可以使用global關(guān)鍵字
a
=
100
def
outer
(
)
:
global
a
a
=
200
print
(
a
)
# 200
if
__name__
==
"__main__"
:
outer
(
)
print
(
a
)
# 200
4,在函數(shù)內(nèi)部是可以用global定義新的全局變量的:
def
outer
(
)
:
global
c
c
=
200
print
(
c
)
# 200
if
__name__
==
"__main__"
:
outer
(
)
print
(
c
)
# 200
5, 不能 先聲明局部的變量,后再用global聲明其為全局變量
def
outer
(
)
:
c
=
100
#不能在定義一個(gè)局部變量之后,后用global聲明它是全局變量
global
c
c
=
200
print
(
c
)
# 200
if
__name__
==
"__main__"
:
outer
(
)
print
(
c
)
# 200
將會(huì)報(bào)錯(cuò):
global
c
^
SyntaxError
:
name
'c'
is
assigned to before
global
declaration
nonlocal
作用:
在內(nèi)層函數(shù)引用修改外層嵌套函數(shù)內(nèi)的變量。(函數(shù)是可以嵌套的,如閉包)
語法
nonlocal 變量名1,變量名2, …
說明
在被嵌套的內(nèi)函數(shù)中進(jìn)行使用
不能先聲明局部的變量,后再用nonlocal 聲明其為外部嵌套變量
案例:
在函數(shù)內(nèi)部
def
outer
(
)
:
c
=
200
def
inner
(
)
:
nonlocal
c
print
(
c
)
# 200
return
inner
if
__name__
==
"__main__"
:
outer
(
)
(
)
不能 先聲明局部的變量,后再用nonlocal 聲明其為外部嵌套變量
def
outer
(
)
:
c
=
200
def
inner
(
)
:
c
=
100
#不能先聲明局部的變量,后再用nonlocal 聲明其為外部嵌套變量
nonlocal
c
print
(
c
)
# 200
return
inner
if
__name__
==
"__main__"
:
outer
(
)
(
)
將會(huì)報(bào)錯(cuò):
nonlocal
c
^
SyntaxError
:
name
'c'
is
assigned to before
nonlocal
declaration
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
