13 命名空間與作用域

2022-08-17 11:24:17 字數 2594 閱讀 2933

一 命名空間

命名空間即存放名字與物件對映/繫結關係的地方。比如說,x=3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間

二 命名空間的載入順序

python test.py

#1、python直譯器先啟動,因而首先載入的是:內建命名空間

#2、執行test.py檔案,然後以檔案為基礎,載入全域性命名空間

#3、在執行檔案的過程中如果呼叫函式,則臨時產生區域性命名空間

三 命名空間三大類

1.內建命名空間

存放python直譯器自帶的名字,python直譯器啟動則產生,關閉則**

print

(len)

#執行結果

in function len>

2.全域性命名空間

存放的是最頂級的名字,隨著python程式剛開始執行則立刻產生,程式結束立刻**

通俗來講,只要不是python自帶的名字,都是全域性命名空間

3.區域性命名空間

存放的是函式內的名字,函式呼叫則產生,函式呼叫結束則銷毀

命名空間的的載入順序是:內建命名空間->全域性命名空間->區域性命名空間,

而查詢訪問乙個名字,會基於自己當前位置從內往外找,查詢順序為:區域性命名空間->全域性命名空間->內建命名空間。legb

總結:命名空間的『巢狀』關係是函式定義階段,掃瞄語法時生成的,與呼叫位置無關

四 作用域

按照名字作用範圍的不同可以將三個命名空間劃分為兩個區域:

全域性作用域:位於全域性命名空間、內建命名空間中的名字屬於全域性範圍,該範圍內的名字全域性存活(除非被刪除,否則在整個檔案執行過程中存活)、全域性有效(在任意位置都可以使用);

區域性作用域:位於區域性命名空間中的名字屬於區域性範圍。該範圍內的名字臨時存活(即在函式呼叫時臨時生成,函式呼叫結束後就釋放)、區域性有效(只能在函式內使用)。

在區域性作用域查詢名字時,起始位置是區域性作用域,所以先查詢區域性命名空間,沒有找到,再去全域性作用域查詢:先查詢全域性命名空間,沒有找到,再查詢內建命名空間,最後都沒有找到就會丟擲異常

x=100 #

全域性作用域的名字x

deffoo():

x=300 #

區域性作用域的名字x

print(x) #

在區域性找x

foo() #

結果為300

在全域性作用域查詢名字時,起始位置便是全域性作用域,所以先查詢全域性命名空間,沒有找到,再查詢內建命名空間,最後都沒有找到就會丟擲異常

x=100

deffoo():

x=300 #

在函式呼叫時產生區域性作用域的名字x

foo()

print(x) #

在全域性找x,結果為100

python支援函式的巢狀定義,在內嵌的函式內查詢名字時,會優先查詢自己區域性作用域的名字,然後由內而外一層層查詢外部巢狀函式定義的作用域,沒有找到,則查詢全域性作用域

x=1

defouter():

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=1

deffoo():

global x #

宣告x為全域性命名空間的名字

x=2foo()

print(x) #

結果為2

當實參的值為可變型別時,函式體內對該值的修改將直接反應到原值,

num_list=[1,2,3]

deffoo(nums):

foo(num_list)

print

(num_list)

#結果為

[1, 2, 3, 5]

對於巢狀多層的函式,使用nonlocal關鍵字可以將名字宣告為來自外部巢狀函式定義的作用域(非全域性)

def

f1():

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...