日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python 函数参数传递机制_Python函数参数传递机制(超级详细)

發(fā)布時(shí)間:2024/9/27 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 函数参数传递机制_Python函数参数传递机制(超级详细) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python中,函數(shù)參數(shù)由實(shí)參傳遞給形參的過程,是由參數(shù)傳遞機(jī)制來控制的。通過學(xué)習(xí)《Python函數(shù)值傳遞和引用傳遞》一節(jié)我們知道,根據(jù)實(shí)際參數(shù)的類型不同,函數(shù)參數(shù)的傳遞方式分為值傳遞和引用傳遞(又稱為地址傳遞),本節(jié)將對(duì)這兩種傳遞機(jī)制做深度剖析。

Python函數(shù)參數(shù)的值傳遞機(jī)制

所謂值傳遞,實(shí)際上就是將實(shí)際參數(shù)值的副本(復(fù)制品)傳入函數(shù),而參數(shù)本身不會(huì)受到任何影響。

值傳遞的方式,類似于《西游記》里的孫悟空,它復(fù)制一個(gè)假孫悟空,假孫悟空具有的能力和真孫悟空相同,可除妖或被砍頭。但不管這個(gè)假孫悟空遇到什么事,真孫悟空都不會(huì)受到任何影響。與此類似,傳入函數(shù)的是實(shí)際參數(shù)值的復(fù)制品,不管在函數(shù)中對(duì)這個(gè)復(fù)制品如何操作,實(shí)際參數(shù)值本身不會(huì)受到任何影響。

下面程序演示了函數(shù)參數(shù)進(jìn)行值傳遞的效果:

def swap(a, b) :

# 下面代碼實(shí)現(xiàn)a、b變量的值交換

a, b = b, a

print("swap函數(shù)里,a的值是", a, ";b的值是", b)

a = 6

b = 9

swap(a , b)

print("交換結(jié)束后,變量a的值是", a, "; 變量b的值是", b)

運(yùn)行上面程序,將看到如下運(yùn)行結(jié)果:

swap函數(shù)里,a的值是 9 ;b的值是 6

交換結(jié)束后,變量a的值是 6 ;變量b的值是 9

從上面的運(yùn)行結(jié)果來看,在 swap() 函數(shù)里,a 和 b 的值分別是 9、6,交換結(jié)束后,變量 a 和 b 的值依然是 6、9。從這個(gè)運(yùn)行結(jié)果可以看出,程序中實(shí)際定義的變量 a 和 b,并不是 swap() 函數(shù)里的 a 和 b 。

正如前面所講的,swap() 函數(shù)里的 a 和 b 只是主程序中變量 a 和 b 的復(fù)制品。下面通過示意圖來說明上面程序的執(zhí)行過程。

上面程序開始定義了 a、b 兩個(gè)局部變量,這兩個(gè)變量在內(nèi)存中的存儲(chǔ)示意圖如圖 1 所示。

主棧區(qū)中 a、b 變量存儲(chǔ)示意圖

當(dāng)程序執(zhí)行 swap() 函數(shù)時(shí),系統(tǒng)進(jìn)入 swap() 函數(shù),并將主程序中的 a、b 變量作為參數(shù)值傳入 swap() 函數(shù),但傳入 swap() 函數(shù)的只是 a、b 的副本,而不是 a、b 本身。進(jìn)入 swap() 函數(shù)后,系統(tǒng)中產(chǎn)生了 4 個(gè)變量,這 4 個(gè)變量在內(nèi)存中的存儲(chǔ)示意圖如圖 2 所示。

主棧區(qū)的變量作為參數(shù)值傳入swap()函數(shù)后存儲(chǔ)示意圖

當(dāng)在主程序中調(diào)用 swap() 函數(shù)時(shí),系統(tǒng)分別為主程序和 swap() 函數(shù)分配兩塊棧區(qū),用于保存它們的局部變量。將主程序中的 a、b 變量作為參數(shù)值傳入 swap() 函數(shù),實(shí)際上是在 swap() 函數(shù)棧區(qū)中重新產(chǎn)生了兩個(gè)變量 a、b,并將主程序棧區(qū)中 a、b 變量的值分別賦值給 swap() 函數(shù)棧區(qū)中的 a、b 參數(shù)(就是對(duì) swap() 函數(shù)的 a、b 兩個(gè)變量進(jìn)行初始化)。此時(shí),系統(tǒng)存在兩個(gè) a 變量、兩個(gè) b 變量,只是存在于不同的棧區(qū)中而己。

程序在 swap() 函數(shù)中交換 a、b 兩個(gè)變量的值,實(shí)際上是對(duì)圖 2 中灰色區(qū)域的 a、b 變量進(jìn)行交換。交換結(jié)束后,輸出 swap() 函數(shù)中 a、b 變量的值,可以看到 a 的值為 9,b 的值為 6,此時(shí)在內(nèi)存中的存儲(chǔ)示意圖如圖 3 所示。

swap()函數(shù)中a、b 交換之后的存儲(chǔ)示意圖

對(duì)比圖 3 與圖 1,可以看到兩個(gè)示意圖中主程序棧區(qū)中 a、b 的值并未有任何改變,程序改變的只是 swap() 函數(shù)棧區(qū)中 a、b 的值。這就是值傳遞的實(shí)質(zhì):當(dāng)系統(tǒng)開始執(zhí)行函數(shù)時(shí),系統(tǒng)對(duì)形參執(zhí)行初始化,就是把實(shí)參變量的值賦給函數(shù)的形參變量,在函數(shù)中操作的并不是實(shí)際的實(shí)參變量。

Python函數(shù)參數(shù)的引用傳遞

如果實(shí)際參數(shù)的數(shù)據(jù)類型是可變對(duì)象(列表、字典),則函數(shù)參數(shù)的傳遞方式將采用引用傳遞方式。需要注意的是,引用傳遞方式的底層實(shí)現(xiàn),采用的依然還是值傳遞的方式。

下面程序示范了引用傳遞參數(shù)的效果:

def swap(dw):

# 下面代碼實(shí)現(xiàn)dw的a、b兩個(gè)元素的值交換

dw['a'], dw['b'] = dw['b'], dw['a']

print("swap函數(shù)里,a元素的值是",\

dw['a'], ";b元素的值是", dw['b'])

dw = {'a': 6, 'b': 9}

swap(dw)

print("交換結(jié)束后,a元素的值是",\

dw['a'], ";b元素的值是", dw['b'])

運(yùn)行上面程序,將看到如下運(yùn)行結(jié)果:

swap函數(shù)里,a元素的值是 9 ;b元素的值是 6

交換結(jié)束后,a元素的值是 9 ;b元素的值是 6

從上面的運(yùn)行結(jié)果來看,在 swap() 函數(shù)里,dw 字典的 a、b 兩個(gè)元素的值被交換成功。不僅如此,當(dāng) swap() 函數(shù)執(zhí)行結(jié)束后,主程序中 dw 字典的 a、b 兩個(gè)元素的值也被交換了。這很容易造成一種錯(cuò)覺,即在調(diào)用 swap() 函數(shù)時(shí),傳入 swap() 函數(shù)的就是 dw 字典本身,而不是它的復(fù)制品。但這只是一種錯(cuò)覺,下面還是結(jié)合示意圖來說明程序的執(zhí)行過程。

程序開始創(chuàng)建了一個(gè)字典對(duì)象,并定義了一個(gè) dw 引用變量(其實(shí)就是一個(gè)指針)指向字典對(duì)象,這意味著此時(shí)內(nèi)存中有兩個(gè)東西:對(duì)象本身和指向該對(duì)象的引用變量。此時(shí)在系統(tǒng)內(nèi)存中的存儲(chǔ)示意圖如圖 4 所示:

主程序創(chuàng)建了字典對(duì)象后存儲(chǔ)示意圖

接下來主程序開始調(diào)用 swap() 函數(shù),在調(diào)用 swap() 函數(shù)時(shí),dw 變量作為參數(shù)傳入 swap() 函數(shù),這里依然采用值傳遞方式:把主程序中 dw 變量的值賦給 swap() 函數(shù)的 dw 形參,從而完成 swap() 函數(shù)的 dw 參數(shù)的初始化。值得指出的是,主程序中的 dw 是一個(gè)引用變量(也就是一個(gè)指針),它保存了字典對(duì)象的地址值,當(dāng)把 dw 的值賦給 swap() 函數(shù)的 dw 參數(shù)后,就是讓 swap() 函數(shù)的 dw 參數(shù)也保存這個(gè)地址值,即也會(huì)引用到同一個(gè)字典對(duì)象。圖 5 顯示了 dw 字典傳入 swap() 函數(shù)后的存儲(chǔ)示意圖。

dw字典傳入swap()函數(shù)后存儲(chǔ)示意圖

從圖 5 來看,這種參數(shù)傳遞方式是不折不扣的值傳遞方式,系統(tǒng)一樣復(fù)制了dw 的副本傳入 swap() 函數(shù)。但由于 dw 只是一個(gè)引用變量,因此系統(tǒng)復(fù)制的是 dw 變量,并未復(fù)制字典本身。

當(dāng)程序在 swap() 函數(shù)中操作 dw 參數(shù)時(shí),由于 dw 只是一個(gè)引用變量,故實(shí)際操作的還是字典對(duì)象。此時(shí),不管是操作主程序中的 dw 變量,還是操作 swap() 函數(shù)里的 dw 參數(shù),其實(shí)操作的都是它們共同引用的字典對(duì)象,它們引用的是同一個(gè)字典對(duì)象。因此,當(dāng)在 swap() 函數(shù)中交換 dw 參數(shù)所引用字典對(duì)象的 a、b 兩個(gè)元素的值后,可以看到在主程序中 dw 變量所引用字典對(duì)象的 a、b 兩個(gè)元素的值也被交換了。

為了更好地證明主程序中的 dw 和 swap() 函數(shù)中的 dw 是兩個(gè)變量,在 swap() 函數(shù)的最后一行增加如下代碼:

把dw 直接賦值為None,讓它不再指向任何對(duì)象

dw = None

運(yùn)行上面代碼,結(jié)果是 swap() 函數(shù)中的 dw 變量不再指向任何對(duì)象,程序其他地方?jīng)]有任何改變。主程序調(diào)用 swap() 函數(shù)后,再次訪問 dw 變量的 a、b 兩個(gè)元素,依然可以輸出 9、6。可見,主程序中的 dw 變量沒有受到任何影響。實(shí)際上,當(dāng)在 swap() 函數(shù)中增加“dw =None”代碼后,在內(nèi)存中的存儲(chǔ)示意圖如圖 6 所示。

將swap()函數(shù)中的dw賦值為None 后存儲(chǔ)示意圖

從圖 6 來看,把 swap() 函數(shù)中的 dw 賦值為 None 后,在 swap() 函數(shù)中失去了對(duì)字典對(duì)象的引用,不可再訪問該字典對(duì)象。但主程序中的 dw 變量不受任何影響,依然可以引用該字典對(duì)象,所以依然可以輸出字典對(duì)象的 a、b 元素的值。

通過上面介紹可以得出如下兩個(gè)結(jié)論:

不管什么類型的參數(shù),在 Python 函數(shù)中對(duì)參數(shù)直接使用“=”符號(hào)賦值是沒用的,直接使用“=”符號(hào)賦值并不能改變參數(shù)。

如果需要讓函數(shù)修改某些數(shù)據(jù),則可以通過把這些數(shù)據(jù)包裝成列表、字典等可變對(duì)象,然后把列表、字典等可變對(duì)象作為參數(shù)傳入函數(shù),在函數(shù)中通過列表、字典的方法修改它們,這樣才能改變這些數(shù)據(jù)。

總結(jié)

以上是生活随笔為你收集整理的python 函数参数传递机制_Python函数参数传递机制(超级详细)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产91片 | 成人在线免费视频观看 | 污网站在线看 | 91视频观看 | 91香蕉视频官网 | wwwwww在线观看 | 日韩欧美精品久久 | 九色porny原创自拍 | 日本精品免费视频 | 美女国产免费 | 日本一区二区三区免费在线观看 | 国产亚洲精久久久久久无码77777 | av大全免费 | 亚洲美女久久 | 欧美小视频在线观看 | 精品一级少妇久久久久久久 | 伊人福利在线 | 成人激情四射网 | 精品美女 | 亚洲视频三区 | 日本少妇作爱视频 | 黑丝美女av| 成年人看的黄色片 | 成人午夜精品一区二区 | 国产啊啊啊啊 | 日日噜噜夜夜狠狠久久波多野 | 欧州一级片 | 亚洲影音先锋 | 国产精品综合一区二区 | 国产免费自拍 | 天堂在线中文字幕 | 后入内射无码人妻一区 | 成年人av在线播放 | 精品www久久久久久奶水 | 日韩有码在线视频 | 国产欧美视频一区二区 | 开心激情网五月天 | 亚洲熟悉妇女xxx妇女av | 亚洲中文字幕无码av永久 | 美女扒开尿口让男人爽 | 在线看黄网址 | 884aa四虎影成人精品一区 | 欧美日韩一区在线观看 | 精品一区欧美 | 成人久久久久久 | 亚洲精品视频久久 | 欧美日韩亚洲色图 | 国内精品久久久久久久 | 日韩色资源 | 国产日韩欧美在线观看视频 | www.毛片.com | 性xxxx视频播放免费 | 欧美高清在线视频 | 自拍视频一区 | 欧美成人小视频 | 97九色 | 黑人操日本女人 | 黄色a∨ | 女人做爰全过程免费观看美女 | 黄色一级免费观看 | 精品成人在线视频 | 伊人久久一区二区 | 男生舔女生胸 | 97超碰中文字幕 | 涩涩av| 亚洲视频手机在线 | 精品嫩模一区二区三区 | 色综合久久88色综合天天6 | 久久久精品99 | 黄色午夜视频 | 乱中年女人伦 | 亚洲天堂久 | 91视频免费视频 | 中文字幕有码视频 | 日日撸夜夜操 | 三级色视频 | 手机亚洲第一页 | 少妇性生活视频 | 精品色哟哟 | 国产精品国产三级国产专播品爱网 | 四虎音影 | 日韩在线欧美在线 | 国产精品二区视频 | 欧美日韩一区二区三区四区五区六区 | 亚洲精品~无码抽插 | 人妻天天爽夜夜爽一区二区三区 | 欧美粗大猛烈 | 国产伦精品一区二区三区妓女下载 | 日韩黄色av| 成年人视频在线看 | 少妇性l交大片免费观看 | 芭乐视频色 | 男女爽爽| 亚欧在线 | 伊人国产在线视频 | www.天天操.com| 91国产高清 | 天堂中文在线播放 | 国语对白做受xxxxx在线中国 |