python函式 命名空間和作用域

2022-06-26 02:57:11 字數 2398 閱讀 3866

一 命名空間

命名空間即存放名字與物件對映/繫結關係的地方。

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

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

1.1 內建命名空間

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

>>> max

#built-in內建

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

1.3 區域性命名空間

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

def foo(x):

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

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

二 作用域

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

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

x=1def 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=1def 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()

3nonlocal x會從當前函式的外層函式開始一層層去查詢名字x,若是一直到最外層函式都找不到,則會丟擲異常

命名空間 Python 函式命名空間及作用域

全域性命名空間 個人寫的 但不是函式中的 區域性命名空間 函式 各級別命名空間之間使用關係 def max l print in max func print max 1,2,3 def func s func 函式的記憶體位址 函式名 函式的呼叫 函式的記憶體位址 函式的呼叫 print in m...

python之函式命名空間和作用域

命名空間一共分為三種 全域性命名空間 區域性命名空間 內建命名空間 python 執行的時候遇到函式是怎麼做的 從python直譯器開始執行之後,就在記憶體中開闢了乙個空間,每當遇到乙個變數的時候,就把變數名和值之間的對應關係記錄下來。但是當遇到函式定義的時候直譯器只是象徵性的將函式名讀入記憶體,表...

函式命名空間和作用域

內建 命名空間 python直譯器啟動之後就可以使用的變數 函式名 全域性 命名空間 在函式外面的變數名 函式名 區域性 命名空間 每乙個函式都擁有自己的命名空間 python直譯器執行 載入順序 所有 內建空間函式名 變數 逐行 載入全域性空間變數 函式名 區域性空間的變數 函式名 在呼叫函式的時...