我們都知道,變數在記憶體中儲存的方式如下:
所有的名稱(變數名、函式名等)都放在棧區,那麼就會存在乙個問題,就是名稱重複,假設有乙個名為a的函式,同時也存在乙個名為a的變數,這樣的話肯定有乙個失效,被另乙個覆蓋。為了解決這個問題,python將棧區空間劃分為3部分,即內建命名空間、全域性命名空間、區域性命名空間。如下圖:
所以命名空間就是存放名字的地方的代稱,不是真是存在的東西,只是對棧區的乙個劃分。
1.內建命名空間
內建命名空間: 存放python直譯器自帶的名稱,比如print函式,我們自己又沒有定義,但是能直接用
存活週期: python直譯器啟動則產生,python直譯器關閉則銷毀
內建命名空間只有乙個
type
(print
)
結果如下:2.區域性命名空間區域性命名空間: 存放函式體**中的名稱
存活週期: 函式呼叫時建立,函式執行完畢則銷毀
區域性命名空間可以有多個,不管是不是同乙個函式,呼叫一次建立乙個區域性命名空間。
3.全域性命名空間
全域性命名空間: 存放除內建和區域性命名空間外所有名稱
存活週期:python程式執行時建立,python程式執行完畢則銷毀
全域性命名空間只有乙個
總結:命名空間
存放名稱
存貨週期
個數內建命名空間python直譯器自帶的名稱
python直譯器啟動產生,python直譯器關閉銷毀
1個全域性命名空間除內建和區域性命名空間外其他所有名稱
python程式執行建立,python程式執行完畢銷毀
1個區域性命名空間函式體**中的名稱
函式呼叫建立,呼叫完畢銷毀
多個
大致順序:
詳細順序:
先從當前所在的命名空間找,找不到按照大致順序去別的命名空間找。
eg:在全域性**中呼叫變數x,如果沒有就去內建命名空間找,不會去區域性。
例項**1:
def
func()
:print
(format
)#先在區域性命名空間找format,沒找到後去全域性命名空間找,沒找到後去內建命名空間找
func(
)
結果如下:
例項**2:
deff1(
):print
(x)x =
1f1(
) 結果為:
1
作用域:名稱作用有效區域,
將三個命名空間內名稱的作用區域劃分為全域性作用域和區域性作用域。
全域性作用域: 內建名稱和全域性名稱的作用範圍,全域性有效
區域性作用域:區域性名稱的作用範圍,區域性有效
1.globals與locals
globals():檢視全域性作用域中的所有名稱
locals():檢視當前作用域中的所用名稱,在全域性作用域中使用locals結果與globals相同
二者的返回值都是字典
def
func1()
:pass
print
(globals
)
結果如下:
)結果如下:
2.global、nonlocal
global:宣告是全域性作用域中的名稱,如果不存在則建立
nonlocal:宣告是區域性作用域的名稱,會呼叫離自己最近的區域性作用域中的名稱,如果沒有再上一層,若區域性作用域中找不到則報錯
示例**1:
defa(
):classa:
passa()
print
(a) 結果為:
<
class
'__main__.a'
>
示例**2:
defa(
):a =
1defb(
):defc()
:nonlocal a
print
(a) c(
) b()a(
) 結果為:
1
示例**3:
a =
1defa(
):defb()
:defc(
):nonlocal a
print
(a) c(
) b()a(
) 結果為:報錯,因為區域性作用域中不存在a
切記:涉及命名空間的巢狀時,記住函式內呼叫的名稱是在函式定義時就已經確定了,與呼叫位置無關。
eg:
x =
2def
func()
: x =
1def
inner()
:print
(x)return inner
func()(
) 結果為1
input
=333
deffunc()
:input
=444
func(
)print
(input
)
def
func()
:print
(x)x =
111func(
)
def
func()
:print
(x)def
foo():
x =222 func(
)x =
333foo(
)
x =
111def
func()
:print
(type
(x))
x =222func(
)
input
=111
deff1()
:deff2(
):input
=333
print
(input
)input
=222
f2()input
=333
f1()
x =
111def
foo():
print
(x)def
bar():
print
(x)foo(
)bar(
)
x =
1def
func2()
: func1(
)x =
2def
func1()
:print
(x)x =
3func2(
)
函式 (二) 命名空間與作用域
我們寫一段 裡面肯定會定義一些變數名,函式名,而一旦我們執行 python直譯器在載入這些 的時候,會在記憶體中開闢一片空間專門用來存放這些名字以及這些名字所繫結的值的關係,這塊記憶體就被稱為命名空間。內建命名空間 內建命名空間是用來存放python直譯器的一些內建方法明以及變數名的。這些名稱是在直...
函式的命名空間與作用域
1 命名空間namespaces 存放名字與值繫結關係的地方 2 命名空間分為三大類 內建命名空間 作用 存放python直譯器自帶的名字 生命週期 在直譯器啟動時生效,在直譯器關閉時失效 全域性命名空間 作用 除了內建的與區域性的名字外,其餘都是全域性名字 生命週期 在檔案執行時生效,在檔案執行完...
命名空間與作用域
命名空間即存放名字與物件對映 繫結關係的地方。對於x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 伴隨python直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,用來存放一些內建的...