1. 程式人生 > >Python的函式傳值與傳引用簡解

Python的函式傳值與傳引用簡解

Python到底值傳值還是傳引用?

先看兩段程式碼

程式碼1:

1 2 3 4 5 6 7 >>> a=3 >>> def f(b): ...     b=1 ...     >>> f(a) >>> a 3
程式碼2:
1 2 3 4 5 6 7 8 >>> a=[1,2] >>> def f(b): ...     b[0]='a' >>> a [12] >>> f(a)
>>> a ['a'2]

程式碼是網上抄來的,但是結果基本上是可信的。

於是可能會有人覺得Python是基本型別傳值,而複雜型別是傳引用。更有人甚至說全都是傳引用balabala...

我的理解是,Python全部都是傳值的,只是Python裡面沒有值,只有引用,所有的變數都是引用。

以C++的觀點,可以認為Python裡面函式都是傳值的,而Python裡面的所有值都是指標。Python統一管理所有的值。

比如說定義a=3,b=3,那麼a和b其實都是引用,真正的值3在記憶體中只有一個空間。

以第一段程式碼為例:指標a指向了儲存3這個字面值的那個空間,然後這個指標被以傳值的方式傳遞給函式f,

由於是傳值的方式傳遞函式的,所以a本身不會被傳進來,而只是造了一個跟a值一樣的指標,傳入f。

在f中,這個臨時造出來的指標被指向了一個新的空間,這個空間的字面值為1,當然沒有對原來的指標a產生任何影響

再來說說第二段程式碼:指標a指向了一個數組的起始地址。然後這個起始地址被以值傳遞的方式傳入函式f,

由於值傳遞產生的臨時變數b和原來指標a的值是一樣的,所以a[0]和b[0]指向的是同一個地址。所以修改

b[0]就等於修改了a[0]。

總的來說,python都是值傳遞的,而python裡面所有的變數其實都是引用。

另外如果想從函式返回值,可以

def function(...):

    balabala...

    return (param1, param2, ...)

balabala

(param1, param2, ...) = function(...)

所有的返回值就都歸為啦