單純的理解“python中的函數(shù)是一等公民”這句話,可能包含幾層意思:
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供科爾沁左翼網(wǎng)站建設、科爾沁左翼做網(wǎng)站、科爾沁左翼網(wǎng)站設計、科爾沁左翼網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、科爾沁左翼企業(yè)網(wǎng)站模板建站服務,10多年科爾沁左翼做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
正確的理解是:第1點和第2點,不包含第3點的意思。
python中的函數(shù)是一等公民,重點想表述的是: 在python世界人人平等 。
人人平等的世界,至少應該包含兩層意思:1. 身份地位平等; 2. 行使的權(quán)利平等。
打印結(jié)果是:
從上面的打印結(jié)果中可以看出:
1.Python 程序中的所有數(shù)據(jù)都是某個類的實例,因而是一個對象;
2.類本身也是一個對象。int, float, str, list, dict, set, fuction, module, NoneType, object, type等,這些類都是type類的實例,也是一個對象;
3.object類是所有類的基類
4.object是頂級父類
函數(shù)function和其他公民一樣,他們的都有一個共同的身份:對象 。
在c++和java里,數(shù)據(jù)是數(shù)據(jù),動作是動作,他倆的結(jié)合是類(class)。對于python,數(shù)據(jù)是數(shù)據(jù),動作也可以是數(shù)據(jù),這個牛逼的數(shù)據(jù)叫做對象object。
對于函數(shù)function來講,既可以安靜的做一個數(shù)據(jù),又可以優(yōu)雅的執(zhí)行動作。
Python 官方文檔里這樣解釋 對象(object) 的含義:Python 中的對象是對數(shù)據(jù)的抽象,Python 程序中所有數(shù)據(jù)都是由對象或者對象間的關(guān)系來表示的。每個對象都有各自的編號、類型和值。
兩個祖先(a和b)占了相鄰的兩塊內(nèi)存,一個可以與它的“后代”共用內(nèi)存,一個卻只能讓“后代”另立門戶;當它們走完自己的生命周期后,b會馬上被當垃圾回收,內(nèi)存地址遺產(chǎn)被剝奪,然而a卻形滅而實存,蔭庇后世。
Python為這些對象傾斜資源,也就是為某種階層固化提供了合法性。劃分的依據(jù)是因為它們比較常用,共用內(nèi)存就意味著減少開支,提高內(nèi)存使用效率。
這就是Python有趣的地方了,一面是全體公民,一面是特權(quán)種族,組成了看似矛盾的二元對立結(jié)構(gòu)。
參考:
這涉及到變量的生命周期問題,一般的,在函數(shù)里面聲明的變量在函數(shù)外是不起作用的。
一個比較簡單的解決辦法是你在函數(shù)外就先聲明這個變量,聲明成全局變量。然后在函數(shù)里面進行操作和賦值。
最后就能在函數(shù)外獲取變量的值了。例如:
123456 x = 0def a(): x = 2if __name__ == '__main__': a() print x
最終x打印出來的結(jié)果就是2
變量的引用
變量和數(shù)據(jù)都是保存在內(nèi)存中的
變量和數(shù)據(jù)是分開存儲的
數(shù)據(jù)保存在內(nèi)存中某個位置,通過地址來標記
變量保存的是數(shù)據(jù)的地址,通過地址可以找到數(shù)據(jù)在內(nèi)存空間的位置
把變量保存數(shù)據(jù)地址的過程稱為引用
變量的重新賦值修改的是變量中引用數(shù)據(jù)的內(nèi)存地址
變量之間的賦值實際是引用的傳遞
函數(shù)參數(shù)的傳遞,本質(zhì)也是引用的傳遞
函數(shù)的返回值本身也是引用的傳遞
可變和不可變類型
不可變類型,內(nèi)存中的數(shù)據(jù)不允許被修改:數(shù)字類型(int,bool,float,complex,long(2,x)、字符串、元組(tuple)
可變類型,內(nèi)存中的數(shù)據(jù)可以被修改:列表list、字典dict
無論是可變還是不可變數(shù)據(jù)類型,通過賦值語句,都會改變變量的引用
Hash函數(shù)只能接收不可變數(shù)據(jù)類型,字典的鍵也只能是不可變數(shù)據(jù)類型,字典的value值可以是任意數(shù)據(jù)類型
局部變量
1.在函數(shù)內(nèi)部定義的變量就是局部變量(作用范圍只能是當前函數(shù)內(nèi)部)
2.在函數(shù)外部無法直接訪問局部變量
3.不同的函數(shù)中可以定義同名的局部變量
4.局部變量的生命周期:從定義變量時開始,到函數(shù)運行結(jié)束
全局變量
1.在所有函數(shù)外邊定義的變量就是全局變量
2.讓所有函數(shù)都能訪問到,可以作為函數(shù)通信的橋梁
3.一般情況下,為了和普通變量的區(qū)別,需要加上g_或gl_前綴
4.全局變量一般放在所有函數(shù)的最上面
5.在函數(shù)內(nèi)部修改全局變量,必須要加上global關(guān)鍵字,如果不加global只是定義了一個同名的局部變量
函數(shù)的多個返回值
在Python中,所有的名字都存在一個空間中,它們在該空間中存在和被操作——這就是命名空間。它就像一個盒子,每一個變量名字都對應裝著一個對象。當查詢變量的時候,會從該盒子里面找到相應的對象。
【定義】
名稱到對象的映射。命名空間是一個字典的實現(xiàn),鍵為變量名,值是變量對應的值。各個命名空間是獨立沒有關(guān)系的,一個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。
相關(guān)推薦:《Python教程》
【分類】
python程序執(zhí)行期間會有2個或3個活動的命名空間(函數(shù)調(diào)用時有3個,函數(shù)調(diào)用結(jié)束后2個)。按照變量定義的位置,可以劃分為以下3類:
Local,局部命名空間,每個函數(shù)所擁有的命名空間,記錄了函數(shù)中定義的所有變量,包括函數(shù)的入?yún)?、?nèi)部定義的局部變量。
Global,全局命名空間,每個模塊加載執(zhí)行時創(chuàng)建的,記錄了模塊中定義的變量,包括模塊中定義的函數(shù)、類、其他導入的模塊、模塊級的變量與常量。
Built-in,python自帶的內(nèi)建命名空間,任何模塊均可以訪問,放著內(nèi)置的函數(shù)和異常。
【生命周期】
Local(局部命名空間)在函數(shù)被調(diào)用時才被創(chuàng)建,但函數(shù)返回結(jié)果或拋出異常時被刪除。(每一個遞歸函數(shù)都擁有自己的命名空間)。
Global(全局命名空間)在模塊被加載時創(chuàng)建,通常一直保留直到python解釋器退出。
Built-in(內(nèi)建命名空間)在python解釋器啟動時創(chuàng)建,一直保留直到解釋器退出。
各命名空間創(chuàng)建順序:python解釋器啟動 -創(chuàng)建內(nèi)建命名空間 - 加載模塊 - 創(chuàng)建全局命名空間 -函數(shù)被調(diào)用 -創(chuàng)建局部命名空間
各命名空間銷毀順序:函數(shù)調(diào)用結(jié)束 - 銷毀函數(shù)對應的局部命名空間 - python虛擬機(解釋器)退出 -銷毀全局命名空間 -銷毀內(nèi)建命名空間
python解釋器加載階段會創(chuàng)建出內(nèi)建命名空間、模塊的全局命名空間,局部命名空間是在運行階段函數(shù)被調(diào)用時動態(tài)創(chuàng)建出來的,函數(shù)調(diào)用結(jié)束動態(tài)的銷毀的。
(1)局部變量 是在 函數(shù)內(nèi)部定義的變量,只能在函數(shù)內(nèi)部使用
(2)函數(shù)執(zhí)行結(jié)束后,函數(shù)內(nèi)部的局部變量,會被系統(tǒng)回收
(3)不同的函數(shù),可以定義相同的名字的局部變量,不會互相影響
示例:
結(jié)果:
所謂生命周期就是變量從被創(chuàng)建到被系統(tǒng)回收的過程
(1)局部變量在函數(shù)執(zhí)行時才會被創(chuàng)建
(2)函數(shù)執(zhí)行結(jié)束后,局部變量被系統(tǒng)回收
(3)局部變量在生命周期內(nèi),可以用來存儲函數(shù)內(nèi)部臨時使用到的數(shù)據(jù)
示例:
結(jié)果:
示例:
結(jié)果:
示例:
結(jié)果:
(1)為了避免局部變量和全局變量出現(xiàn)混淆,在定義全局變量時,有些公司會有一些開發(fā)要求,例如:全局變量名前加上gl_或者g_的前綴,但不同公司可能不一致;
(2)建議全局變量的命名與局部變量的規(guī)則區(qū)分開;
文章題目:python函數(shù)生命周期 python 生命周期
分享路徑:http://jinyejixie.com/article36/dosccsg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、App設計、網(wǎng)站設計、ChatGPT、Google、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)