一 命名空間
命名空間即存放名字與物件對映/繫結關係的地方。比如說,x=3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間
二 命名空間的載入順序
python test.py#1、python直譯器先啟動,因而首先載入的是:內建命名空間
#2、執行test.py檔案,然後以檔案為基礎,載入全域性命名空間
#3、在執行檔案的過程中如果呼叫函式,則臨時產生區域性命名空間
三 命名空間三大類
1.內建命名空間
存放python直譯器自帶的名字,python直譯器啟動則產生,關閉則**
(len)
#執行結果
in function len>
2.全域性命名空間
存放的是最頂級的名字,隨著python程式剛開始執行則立刻產生,程式結束立刻**
通俗來講,只要不是python自帶的名字,都是全域性命名空間
3.區域性命名空間
存放的是函式內的名字,函式呼叫則產生,函式呼叫結束則銷毀
命名空間的的載入順序是:內建命名空間->全域性命名空間->區域性命名空間,
而查詢訪問乙個名字,會基於自己當前位置從內往外找,查詢順序為:區域性命名空間->全域性命名空間->內建命名空間。legb
總結:命名空間的『巢狀』關係是函式定義階段,掃瞄語法時生成的,與呼叫位置無關
四 作用域
按照名字作用範圍的不同可以將三個命名空間劃分為兩個區域:
全域性作用域:位於全域性命名空間、內建命名空間中的名字屬於全域性範圍,該範圍內的名字全域性存活(除非被刪除,否則在整個檔案執行過程中存活)、全域性有效(在任意位置都可以使用);
區域性作用域:位於區域性命名空間中的名字屬於區域性範圍。該範圍內的名字臨時存活(即在函式呼叫時臨時生成,函式呼叫結束後就釋放)、區域性有效(只能在函式內使用)。
在區域性作用域查詢名字時,起始位置是區域性作用域,所以先查詢區域性命名空間,沒有找到,再去全域性作用域查詢:先查詢全域性命名空間,沒有找到,再查詢內建命名空間,最後都沒有找到就會丟擲異常
x=100 #全域性作用域的名字x
deffoo():
x=300 #
區域性作用域的名字x
print(x) #
在區域性找x
foo() #
結果為300
在全域性作用域查詢名字時,起始位置便是全域性作用域,所以先查詢全域性命名空間,沒有找到,再查詢內建命名空間,最後都沒有找到就會丟擲異常
x=100deffoo():
x=300 #
在函式呼叫時產生區域性作用域的名字x
foo()
print(x) #
在全域性找x,結果為100
python支援函式的巢狀定義,在內嵌的函式內查詢名字時,會優先查詢自己區域性作用域的名字,然後由內而外一層層查詢外部巢狀函式定義的作用域,沒有找到,則查詢全域性作用域
x=1defouter():
x=2def inner(): #
函式名inner屬於outer這一層作用域的名字
x=3print('
inner x:%s
' %x)
inner()
print('
outer x:%s
' %x)
outer()
# 結果為
inner x:3outer x:2
在函式內,無論巢狀多少層,都可以檢視到全域性作用域的名字,若要在函式內修改全域性命名空間中名字的值,當值為不可變型別時,則需要用到global關鍵字
x=1deffoo():
global x #
宣告x為全域性命名空間的名字
x=2foo()
print(x) #
結果為2
當實參的值為可變型別時,函式體內對該值的修改將直接反應到原值,
num_list=[1,2,3]deffoo(nums):
foo(num_list)
(num_list)
#結果為
[1, 2, 3, 5]
對於巢狀多層的函式,使用nonlocal關鍵字可以將名字宣告為來自外部巢狀函式定義的作用域(非全域性)
deff1():
x=2def
f2():
nonlocal x
x=3f2()
#呼叫f2(),修改f1作用域中名字x的值
print(x) #
在f1作用域檢視x
f1()
# 結果
3
nonlocal x會從當前函式的外層函式開始一層層去查詢名字x,若是一直到最外層函式都找不到,則會丟擲異常。
13 命名空間和作用域
globals 返回當前全域性作用域內變數的字典 locals 返回當前區域性作用域內的變數的字典 此示例示意globals 函式和locals 函式的用法 a 1 b 2 c 3 def fx c,d e 300 此處有幾個區域性變數?print locals 返回 locals 有幾個全域性變數...
命名空間與作用域
命名空間即存放名字與物件對映 繫結關係的地方。對於x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 伴隨python直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,用來存放一些內建的...
命名空間與作用域
定義 它是儲存作用域中變數的字典。乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。分類 按照變數定義的位置,可以劃分為以下3類 local,區域性命名空間,記錄了函式中定義的所有變數,包括函式的入參 內部定義的區域性變數。使用locals 檢視區域性命名空間。返回的是字典 glo...