Python名稱空間與作用域
一 名稱空間
名稱空間即存放名字與對象映射/綁定關系的地方。對于x=3,Python會申請內(nèi)存空間存放對象3,然后將名字x與3的綁定關系存放于名稱空間中,del x表示清除該綁定關系。
? 在程序執(zhí)行期間最多會存在三種名稱空間
1.1 內(nèi)建名稱空間
伴隨python解釋器的啟動/關閉而產(chǎn)生/回收,因而是第一個被加載的名稱空間,用來存放一些內(nèi)置的名字,比如內(nèi)建函數(shù)名
>>> max <built-in function max> #built-in內(nèi)建
1.2 全局名稱空間
伴隨python文件的開始執(zhí)行/執(zhí)行完畢而產(chǎn)生/回收,是第二個被加載的名稱空間,文件執(zhí)行過程中產(chǎn)生的名字都會存放于該名稱空間中,如下名字
import sys #模塊名sys x=1 #變量名x if x == 1: y=2 #變量名y def foo(x): #函數(shù)名foo y=1 def bar(): pass Class Bar: #類名Bar pass
1.3 局部名稱空間
伴隨函數(shù)的調(diào)用/結束而臨時產(chǎn)生/回收,函數(shù)的形參、函數(shù)內(nèi)定義的名字都會被存放于該名稱空間中
def foo(x): y=3 #調(diào)用函數(shù)時,才會執(zhí)行函數(shù)代碼,名字x和y都存放于該函數(shù)的局部名稱空間中
名稱空間的加載順序是:內(nèi)置名稱空間->全局名稱空間->局部名稱空間,而查找一個名字,必須從三個名稱空間之一找到,查找順序為:局部名稱空間->全局名稱空間->內(nèi)置名稱空間。
二 作用域
2.1 全局作用域與局部作用域
按照名字作用范圍的不同可以將三個名稱空間劃分為兩個區(qū)域:
全局作用域:位于全局名稱空間、內(nèi)建名稱空間中的名字屬于全局范圍,該范圍內(nèi)的名字全局存活(除非被刪除,否則在整個文件執(zhí)行過程中存活)、全局有效(在任意位置都可以使用);
局部作用域:位于局部名稱空間中的名字屬于局部范圍。該范圍內(nèi)的名字臨時存活(即在函數(shù)調(diào)用時臨時生成,函數(shù)調(diào)用結束后就釋放)、局部有效(只能在函數(shù)內(nèi)使用)。
2.2 作用域與名字查找的優(yōu)先級
? 在局部作用域查找名字時,起始位置是局部作用域,所以先查找局部名稱空間,沒有找到,再去全局作用域查找:先查找全局名稱空間,沒有找到,再查找內(nèi)置名稱空間,最后都沒有找到就會拋出異常
x=100 #全局作用域的名字x def foo(): x=300 #局部作用域的名字x print(x) #在局部找x foo()#結果為300
在全局作用域查找名字時,起始位置便是全局作用域,所以先查找全局名稱空間,沒有找到,再查找內(nèi)置名稱空間,最后都沒有找到就會拋出異常
x=100 def foo(): x=300 #在函數(shù)調(diào)用時產(chǎn)生局部作用域的名字x foo() print(x) #在全局找x,結果為100
提示:可以調(diào)用內(nèi)建函數(shù)locals()和globals()來分別查看局部作用域和全局作用域的名字,查看的結果都是字典格式。在全局作用域查看到的locals()的結果等于globals()
Python支持函數(shù)的嵌套定義,在內(nèi)嵌的函數(shù)內(nèi)查找名字時,會優(yōu)先查找自己局部作用域的名字,然后由內(nèi)而外一層層查找外部嵌套函數(shù)定義的作用域,沒有找到,則查找全局作用域
x=1 def outer(): x=2 def inner(): # 函數(shù)名inner屬于outer這一層作用域的名字 x=3 print('inner x:%s' %x) inner() print('outer x:%s' %x) outer() #結果為 inner x:3 outer x:2
在函數(shù)內(nèi),無論嵌套多少層,都可以查看到全局作用域的名字,若要在函數(shù)內(nèi)修改全局名稱空間中名字的值,當值為不可變類型時,則需要用到global關鍵字
x=1 def foo(): global x #聲明x為全局名稱空間的名字 x=2 foo() print(x) #結果為2
當實參的值為可變類型時,函數(shù)體內(nèi)對該值的修改將直接反應到原值,
num_list=[1,2,3] def foo(nums): nums.append(5) foo(num_list) print(num_list) #結果為 [1, 2, 3, 5]
對于嵌套多層的函數(shù),使用nonlocal關鍵字可以將名字聲明為來自外部嵌套函數(shù)定義的作用域(非全局)
def f1(): x=2 def f2(): nonlocal x x=3 f2() #調(diào)用f2(),修改f1作用域中名字x的值 print(x) #在f1作用域查看x f1() #結果 3
nonlocal x會從當前函數(shù)的外層函數(shù)開始一層層去查找名字x,若是一直到最外層函數(shù)都找不到,則會拋出異常。
到此這篇關于Python名稱空間與作用域的文章就介紹到這了,更多相關名稱空間與作用域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)破解網(wǎng)站登錄密碼(帶token驗證)
這篇文章主要為大家介紹一個Python暴力破解網(wǎng)站登錄密碼腳本(帶token驗證),文中的過程講解詳細,對我們學習Python有一定的幫助,感興趣的可以學習一下2022-02-02python 把文件中的每一行以數(shù)組的元素放入數(shù)組中的方法
下面小編就為大家分享一篇python 把文件中的每一行以數(shù)組的元素放入數(shù)組中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python網(wǎng)頁解析利器BeautifulSoup安裝使用介紹
這篇文章主要介紹了Python網(wǎng)頁解析利器BeautifulSoup安裝使用介紹,本文用一個完整示例一步一步安裝了BeautifulSoup的安裝和使用過程,需要的朋友可以參考下2015-03-03TensorFlow安裝及jupyter notebook配置方法
下面小編就為大家?guī)硪黄猅ensorFlow安裝及jupyter notebook配置方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09python操作音視頻ffmpeg-python對比pyav選擇
這篇文章主要介紹了python操作音視頻的選擇:ffmpeg-python對比pyav,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11