首先放出結論: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。