Python中函數參數的傳遞方式(可變對象及不可變對象的區別)


首先放出結論:python中一切函數傳參皆為引用傳遞

下面舉兩個例子,並分析其中到底發生了什么,來解釋這個結論。

a=1
def f(x):
  a = 2
f(a)
print(a)
輸出1
因為int是不可變對象

a=[]
def f(x):
  x.append(1)
f(a)
print(a)
輸出[1],因為list是可變對象

l=[1,2,3] def f(x): x=x+[4] f(l) print(l) 輸出為[1,2,3],這里和可變對象/不可變對象沒關系,x=x+[4]是在新建對象而不是改變對象

看起來很像值傳遞是吧?其實並不是。

當我們調用f(l)的時候,首先,我們給函數f傳入了l的內存地址A。

當運行x=x+[4]的時候,python開辟了新的內存地址B,然后從內存地址A中取出內容,加上[4]以后,把這個和放在內存B里。

至於為什么會開辟新的內存地址B,這里有個事實,python中創建新對象一定是開辟新空間(涉及到常量折疊的話另說)

隨着函數的退出,x變量釋放,沒有變量指向內存空間B,空間B就被釋放了。

所以,整個過程中,我們沒有對內存空間A做任何改變。

那么怎么改變呢?l是list對象,是可變對象,我們是可以原地(當前地址上)改變它的。

答:在函數中調用append。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM