1. 程式人生 > >python學習入門番外1 變數與物件,函式傳值問題 2018.8.18

python學習入門番外1 變數與物件,函式傳值問題 2018.8.18

函式傳值的問題中,多有對函式傳值是按值傳遞還是按引用傳遞引數的討論,這些都源於C系語言。
但事實上,python中並不適用。

預設情況下,在C語言中,引數是按照值來傳遞的,這需要生成函式的傳入引數的一個副本以供使用,這時你不能修改傳入引數的初始內容
當使用指標變數(*var)時,將通過間接引用運算子將變數(引數)的記憶體地址傳遞給函式,這時可以改變傳入引數的值。

而在python中,傳入引數也有可變與不可變之分,人們認為這是傳值或引用的區別,但事實上並非如此

明確:python中始終按值傳遞引數,(見於python程式設計第三版P126)

那為什麼會有能否對傳入引數修改的區別呢?

我們需要弄清三點:

1.變數與物件的區別
2.python中的傳值意義
3.可變物件與不可變物件

1.python中,一切皆物件,變數無資料型別,物件才有資料型別!
變數始終引用物件(指向記憶體地址)

並且python變數賦值是特殊的,它不是變數盒子模型,而是類似於識別符號充當貼紙貼到記憶體地址上(即變數修改時,不是新值被寫入變數的記憶體地址,而是變數指向新值的記憶體地址)
變數盒子模型中,變數是被宣告有記憶體地址的
而python變數未被宣告,不存在記憶體。 物件才有記憶體地址,變數只是引用作用

2.python中的傳值應是賦值的意思。
下面來看函式呼叫的四步過程:

1.呼叫程式暫停
2.實參的值賦給形參
3.執行函式體
4.控制返回,函式返回值作為表示式結果

所以傳值是指 實參賦值給形參 ,以此來傳遞引數

3.可變物件包括 列表,字典,集合,圖形物件等
不可變物件包括 字串,整數,浮點數等

注意:變數本身不能被函式改變

所以對於不可變物件如字串,當值改變時,識別符號指向新值,舊值在程式空閒時自動被垃圾回收。
對於可變物件如列表,它的記憶體地址不變,只是內容被寫入了新值,舊值會被垃圾回收

這裡寫圖片描述

當函式中傳值時:
1.賦值

  • 實參,形參將會指向同一記憶體地址

2.修改形參

  • 若為不可變物件,形參指向新的記憶體地址,實參不變(因為函式中是對形參操作)
  • 若為可變物件,則內容寫入新值
當要更改 不可變物件 時,一個明顯的替代是讓函式返回值來更新不可變物件。