Python的函式傳值與傳引用簡解
阿新 • • 發佈:2019-02-01
Python到底值傳值還是傳引用?
先看兩段程式碼
程式碼1:
1 2 3 4 5 6 7 |
>>> a = 3
>>> def f(b):
... b = 1
...
>>> f(a)
>>> a
3
|
1 2 3 4 5 6 7 8 |
>>> a = [ 1 , 2 ]
>>> def f(b):
... b[ 0 ] = 'a'
>>> a
[ 1 , 2 ]
>>> 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(...)
所有的返回值就都歸為啦