Python中,函數引數由實參傳遞給形參的過程,是由引數傳遞機制來控制的。通過學習《Python函數值傳遞和參照傳遞》一節我們知道,根據實際引數的型別不同,函數引數的傳遞方式分為值傳遞和參照傳遞(又稱為地址傳遞),本節將對這兩種傳遞機制做深度剖析。
Python函數引數的值傳遞機制
所謂值傳遞,實際上就是將實際引數值的副本(複製品)傳入函數,而引數本身不會受到任何影響。
值傳遞的方式,類似於《西遊記》裡的孫悟空,它複製一個假孫悟空,假孫悟空具有的能力和真孫悟空相同,可除妖或被砍頭。但不管這個假孫悟空遇到什麼事,真孫悟空都不會受到任何影響。與此類似,傳入函數的是實際引數值的複製品,不管在函數中對這個複製品如何操作,實際引數值本身不會受到任何影響。
下面程式演示了函數引數進行值傳遞的效果:
def swap(a , b) :
# 下面程式碼實現a、b變數的值交換
a, b = b, a
print("swap函數里,a的值是",
a, ";b的值是", b)
a = 6
b = 9
swap(a , b)
print("交換結束後,變數a的值是",
a , ";變數b的值是", b)
執行上面程式,將看到如下執行結果:
swap函數里,a的值是 9 ;b的值是 6
交換結束後,變數a的值是 6 ;變數b的值是 9
從上面的執行結果來看,在 swap() 函數里,a 和 b 的值分別是 9、6,交換結束後,變數 a 和 b 的值依然是 6、9。從這個執行結果可以看出,程式中實際定義的變數 a 和 b,並不是 swap() 函數裡的 a 和 b 。
正如前面所講的,swap() 函數裡的 a 和 b 只是主程式中變數 a 和 b 的複製品。下面通過示意圖來說明上面程式的執行過程。
上面程式開始定義了 a、b 兩個區域性變數,這兩個變數在記憶體中的儲存示意圖如圖 1 所示。
圖 1 主棧區中 a、b 變數儲存示意圖