python函數(shù)傳參意義示例詳解
C++這樣的語(yǔ)言用多了之后,在Python函數(shù)傳遞參數(shù)的時(shí)候,經(jīng)常會(huì)遇到一個(gè)問(wèn)題,我要傳遞一個(gè)引用怎么辦?
比如我們想要傳一個(gè)x到函數(shù)中做個(gè)運(yùn)算改變x的值:
def change(y): y += 1 x = 1 print ("before change:", x) change(x) print ("after change: ", x)
得到的結(jié)果是
before change: 1
after change: 1
完全沒(méi)用~~~這是怎么回事?
我來(lái)說(shuō)明一下這個(gè)過(guò)程~
也就是說(shuō)python中的等號(hào)就是把變量指向了一個(gè)實(shí)例而已。
那么,如何做到其它語(yǔ)言中引用這樣的效果呢?一個(gè)比較推薦的方法就是用把參數(shù)return回去就可以了,如下面代碼所示。
def change(y): y += 1 return y x = 1 print ("before change:", x) x = change(x) print ("after change: ", x)
結(jié)果為
before change: 1
after change: 2
另一種方法就是,我們不讓函數(shù)中的參數(shù)指向新的地址不就可以了,我們讓它在原來(lái)的地址上修改我們的值。這一點(diǎn),只有一部分的數(shù)據(jù)類型可以做到,我們把這樣的對(duì)象叫做可變對(duì)象,做不到的就叫不可變對(duì)象。
- 不可變對(duì)象:int,string,float,tuple 等
- 可變對(duì)象 :list,dictionary 等
舉幾個(gè)例子更為通俗易懂
def change(x): print ("before append:", x, "id:", id(x)) x.append(0) print ("after append:", x, "id:", id(x)) x = [1, 2, 3] print ("before change:", x, "id:", id(x)) change(x) print ("after change:", x, "id:", id(x))
before change: [1, 2, 3] id: 140623459512008 before append: [1, 2, 3] id: 140623459512008 after append: [1, 2, 3, 0] id: 140623459512008 after change: [1, 2, 3, 0] id: 140623459512008
由于list在做append操作時(shí),x指向的地址是不變的,所以可以有引用的效果,x[0] = 4這樣的操作也是沒(méi)問(wèn)題的
然而,如果是把x指向了新的地址就不行了,如下
def change(x): print ("before equal:", x, "id:", id(x)) x = [5] print ("after equal:", x, "id:", id(x)) x = [1, 2, 3] print ("before change:", x, "id:", id(x)) change(x) print ("after change:", x, "id:", id(x))
before change: [1, 2, 3] id: 139683058095432 before equal: [1, 2, 3] id: 139683058095432 after equal: [5] id: 139683058028360 after change: [1, 2, 3] id: 139683058095432
這下應(yīng)該就搞清楚是怎么回事了吧,不過(guò)正是因?yàn)閜ython的這種特性,在函數(shù)設(shè)置默認(rèn)參數(shù)的時(shí)候,我們要注意盡量不用可變對(duì)象當(dāng)默認(rèn)值,否則會(huì)發(fā)生下面這種情況
def change(x=[]): x.append(1) return x print (change()) print (change())
[1]
[1, 1]
比較妥當(dāng)?shù)淖龇ㄊ怯貌豢勺儗?duì)象來(lái)代替[],比如None
def change(x=None): if not x: x = [] x.append(1) return x print (change()) print (change())
此時(shí)的輸出為
[1]
[1]
以上就是python函數(shù)傳參意義示例詳解的詳細(xì)內(nèi)容,更多關(guān)于python函數(shù)傳參的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Selenium定位瀏覽器彈窗方法實(shí)例總結(jié)
彈出框是自動(dòng)化測(cè)試中一種常見的元素,這種元素通常是客戶端自帶的,下面這篇文章主要給大家介紹了關(guān)于Selenium定位瀏覽器彈窗方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06python 判斷矩陣中每行非零個(gè)數(shù)的方法
今天小編就為大家分享一篇python 判斷矩陣中每行非零個(gè)數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python數(shù)學(xué)建模是加深Numpy和Pandas學(xué)習(xí)
這篇文章主要介紹了python數(shù)學(xué)建模是加深Numpy和Pandas學(xué)習(xí),緊接上一篇學(xué)習(xí)內(nèi)容展開Numpy更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-07-07使用python快速獲取PDF文件頁(yè)數(shù)的辦法
有時(shí)在處理或打印一個(gè)PDF文檔之前,你可能需要先知道該文檔包含多少頁(yè),對(duì)于程序員來(lái)說(shuō),編寫腳本來(lái)完成這項(xiàng)工作會(huì)更加高效,本文就介紹一個(gè)使用Python快速獲取PDF文件頁(yè)數(shù)的辦法,需要的朋友可以參考下2024-03-03python 模擬貸款卡號(hào)生成規(guī)則過(guò)程解析
這篇文章主要介紹了python 模擬貸款卡號(hào)生成規(guī)則過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python操作數(shù)據(jù)庫(kù)之sqlite3打開數(shù)據(jù)庫(kù)、刪除、修改示例
這篇文章主要介紹了python操作sqlite3打開數(shù)據(jù)庫(kù)、刪除、修改示例,需要的朋友可以參考下2014-03-03在pycharm中無(wú)法import所安裝的庫(kù)解決方案
這篇文章主要介紹了在pycharm中無(wú)法import所安裝的庫(kù)解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05