python進(jìn)行參數(shù)傳遞的方法
在分析python的參數(shù)傳遞是如何進(jìn)行的之前,我們需要先來了解一下,python變量和賦值的基本原理,這樣有助于我們更好的理解參數(shù)傳遞。
python變量以及賦值
- 數(shù)值
從幾行代碼開始
In [1]: a = 1 In [2]: b = a In [3]: a = a + 1
我們先將1賦值給a,也就是a指向了1這個(gè)對象,在python中一切皆對象。接著b=a,則表示讓b也指向了1這個(gè)對象,python中一個(gè)對象是可以被多個(gè)引用所指向。最后執(zhí)行的a=a+1,這里需要注意一點(diǎn),python的數(shù)據(jù)類型中如int、str等不可變類型,執(zhí)a=a+1這種操作,并不是把a(bǔ)指向的對象的值增加1,而是生成一個(gè)新的對象2,并讓a指向2這個(gè)對象,原來的對象還存在于內(nèi)存中。那這里的話還是會(huì)被指向,我們來分別看一下a和b的值:
In [4]: a Out[4]: 2 In [5]: b Out[5]: 1
通過這個(gè)例子你可以看到,這里的 a 和 b,開始只是兩個(gè)指向同一個(gè)對象的變量而已,或者你也可以把它們想象成同一個(gè)對象的兩個(gè)名字。簡單的賦值 b = a,并不表示重新創(chuàng)建了新對象,只是讓同一個(gè)對象被多個(gè)變量指向或引用。同時(shí),指向同一個(gè)對象,也并不意味著兩個(gè)變量就被綁定到了一起。如果你給其中一個(gè)變量重新賦值,并不會(huì)影響其他變量的值。
- 列表
還有一個(gè)列表的例子,再來瞅瞅:
In [6]: l1 = [3,4,5,6] In [7]: l2 = l1 In [10]: l1.append(7) In [11]: l1 Out[11]: [3, 4, 5, 6, 7] In [12]: l2 Out[12]: [3, 4, 5, 6, 7]
代碼中,我們讓l1和l2這兩個(gè)變量都指向了[3,4,5,6]這個(gè)對象,我們知道列表是一種可變的數(shù)據(jù)結(jié)構(gòu),所以append操作并不會(huì)產(chǎn)生新的對象,只是在末尾添加了一個(gè)元素,變成了[3, 4, 5, 6, 7],由于 l1 和 l2 同時(shí)指向這個(gè)列表,所以列表的變化會(huì)同時(shí)反映在 l1 和 l2 這兩個(gè)變量上,那么,l1 和 l2 的值就同時(shí)變?yōu)榱薣3, 4, 5, 6, 7]。
- 對象刪除
python中變量是可以刪除的,但是對象是沒辦法刪除的
In [22]: a = [1,4,5] In [23]: del a
del語句刪除a這個(gè)變量,就無法通過a訪問[1,4,5],但是這個(gè)對象在存在中還是存在的,python的垃圾回收機(jī)制發(fā)現(xiàn)引用為0的時(shí)候就會(huì)把它回收掉。
- 總結(jié)
- 變量的賦值,只是表示讓變量指向了某個(gè)對象,并不表示拷貝對象給變量;而一個(gè)對象,可以被多個(gè)變量所指向
- 可變對象(列表,字典,集合等等)的改變,會(huì)影響所有指向該對象的變量
- 對于不可變對象(字符串、整型、元組等等),所有指向該對象的變量的值總是一樣的,也不會(huì)改變。但是通過某些操作(+= 等等)更新不可變對象的值時(shí),會(huì)返回一個(gè)新的對象
變量可以被刪除,但是對象無法被刪除
python函數(shù)是如何進(jìn)行參數(shù)傳遞的
python的參數(shù)傳遞是賦值傳遞或者說是引用傳遞,python里一切皆對象,所以參數(shù)傳遞時(shí),只是讓新變量與原變量指向了同一個(gè)對象,下面我們來看個(gè)例子:
In [28]: def func(b): ...: b = 2 In [29]: a = 1 In [30]: func(a) In [31]: a Out[31]: 1
這里的參數(shù)傳遞,使變量 a 和 b 同時(shí)指向了 1 這個(gè)對象。但當(dāng)我們執(zhí)行到 b = 2 時(shí),系統(tǒng)會(huì)重新創(chuàng)建一個(gè)值為 2 的新對象,并讓 b 指向它;而 a 仍然指向 1 這個(gè)對象。所以,a 的值不變,仍然為 1。
如何改變a的值呢?
我們可以在函數(shù)中將b返回
def func(b): b = 2 return b a = 1 a = func(a) a 2
上面的例子我們的是int類型的,下面我們看一下列表的例子:
def func(l2): l2.append(77) l1 = [12,3,6] func(l1) l1 [12,3,6,77]
這里 l1 和 l2 先是同時(shí)指向值為[1, 2, 3]的列表。不過,由于列表可變,執(zhí)行 append() 函數(shù),對其末尾加入新元素 4 時(shí),變量 l1 和 l2 的值也都隨之改變了.
那大家看一下面的例子,結(jié)果是什么呢?
def func(l2): l2 = l2 + [4] l1 = [12,3,6] func(l1) l1 [12,3,6]
可以看到,l1沒有發(fā)生變化,原因是l2 + [4]這個(gè)操作表示創(chuàng)建了一個(gè)末尾加入元素 4的新列表,并讓 l2 指向這個(gè)新的對象,l1還是指向原有的對象。
總結(jié)
今天,我們討論了 Python 的變量及其賦值的基本原理,并且解釋了 Python 中參數(shù)是如何傳遞的。和其他語言不同的是,Python 中參數(shù)的傳遞既不是值傳遞,也不是引用傳遞,而是賦值傳遞,或者是叫對象的引用傳遞。需要注意的是,這里的賦值或?qū)ο蟮囊脗鬟f,不是指向一個(gè)具體的內(nèi)存地址,而是指向一個(gè)具體的對象。
以上就是python進(jìn)行參數(shù)傳遞的方法的詳細(xì)內(nèi)容,更多關(guān)于python如何進(jìn)行參數(shù)傳遞的的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何用Python實(shí)現(xiàn)自動(dòng)發(fā)送微博
大家好,本篇文章主要講的是如何用Python實(shí)現(xiàn)自動(dòng)發(fā)送微博,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏2022-01-01解決python中的冪函數(shù)、指數(shù)函數(shù)問題
今天小編就為大家分享一篇解決python中的冪函數(shù)、指數(shù)函數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python實(shí)現(xiàn)人臉識(shí)別的詳細(xì)圖文教程
人臉識(shí)別是人工智能的一個(gè)重要應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)人臉識(shí)別的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08教你使用python實(shí)現(xiàn)微信每天給女朋友說晚安
非常棒的一個(gè)python小實(shí)戰(zhàn),文章主要教大家如何用python實(shí)現(xiàn)微信每天給女朋友說晚安,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03同時(shí)安裝Python2 & Python3 cmd下版本自由選擇的方法
下面小編就為大家分享一篇同時(shí)安裝Python2 & Python3 cmd下版本自由選擇的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12python使用collections模塊的容器數(shù)據(jù)類型高效處理數(shù)據(jù)
這篇文章主要為大家介紹了python使用collections模塊的容器數(shù)據(jù)類型高效處理數(shù)據(jù)的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Python?PySpark案例實(shí)戰(zhàn)教程
PySpark是由Spark官方開發(fā)的Python語言第三方庫,Python開發(fā)者可以使用pip程序快速的安裝PySpark并像其它三方庫那樣直接使用,本文給大家介紹Python?PySpark案例實(shí)戰(zhàn),感興趣的朋友一起看看吧2023-09-09