命名空間與作用域

2022-07-31 19:24:10 字數 2932 閱讀 9196

命名空間即存放名字與物件對映/繫結關係的地方。對於x=3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係

​ 在程式執行期間最多會存在三種命名空間

1.內建命名空間

伴隨python直譯器的啟動/關閉而產生/**,因而是第乙個被載入的命名空間,用來存放一些內建的名字,比如內建函式名

>>> max

#built-in內建

2.全域性命名空間

伴隨python檔案的開始執行/執行完畢而產生/**,是第二個被載入的命名空間,檔案執行過程中產生的名字都會存放於該命名空間中,如下名字

import sys #模組名sys

x=1 #變數名x

if x == 1:

y=2 #變數名y

def foo(x): #函式名foo

y=1def bar():

pass

class bar: #類名bar

pass

3.區域性命名空間

伴隨函式的呼叫/結束而臨時產生/**,函式的形參、函式內定義的名字都會被存放於該命名空間中

def foo(x):

y=3 #呼叫函式時,才會執行函式**,名字x和y都存放於該函式的區域性命名空間中

ps:命名空間的載入順序是:內建命名空間->全域性命名空間->區域性命名空間,而查詢乙個名字,必須從三個命名空間之一找到,查詢順序為:區域性命名空間->全域性命名空間->內建命名空間。

1.全域性作用域與區域性作用域

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

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

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

2.作用域與名字查詢的優先順序

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

x=100 #全域性作用域的名字x

def foo():

x=300 #區域性作用域的名字x

print(x) #在區域性找x

foo()#結果為300

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

x=100

def foo():

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

foo()

print(x) #在全域性找x,結果為100

ps:可以呼叫內建函式locals()和globals()來分別檢視區域性作用域和全域性作用域的名字,檢視的結果都是字典格式。在全域性作用域檢視到的locals()的結果等於globals()

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

x=1

def outer():

x=2def inner(): # 函式名inner屬於outer這一層作用域的名字

x=3print('inner x:%s' %x)

inner()

print('outer x:%s' %x)

outer()

#結果為

inner x:3

outer x:2

在函式內,無論巢狀多少層,都可以檢視到全域性作用域的名字,若要在函式內修改全域性命名空間中名字的值,當值為不可變型別時,則需要用到global關鍵字

x=1

def foo():

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

x=2foo()

print(x) #結果為2

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

num_list=[1,2,3]

def foo(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,若是一直到最外層函式都找不到,則會丟擲異常。

命名空間與作用域

命名空間即存放名字與物件對映 繫結關係的地方。對於x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 伴隨python直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,用來存放一些內建的...

命名空間與作用域

定義 它是儲存作用域中變數的字典。乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。分類 按照變數定義的位置,可以劃分為以下3類 local,區域性命名空間,記錄了函式中定義的所有變數,包括函式的入參 內部定義的區域性變數。使用locals 檢視區域性命名空間。返回的是字典 glo...

命名空間與作用域

有了命名空間之後,就可以在棧區中存放相同的名字,詳細的命名空間 存放的名字 內建命名空間存放的是python直譯器自帶的名字 例如 print input 生命週期 py直譯器啟動則產生,直譯器關閉則銷毀 存放的名字 只要不是內建的和函式內定義的名字,都是全域性命名空間 生命週期 python檔案執...