1. 程式人生 > 實用技巧 >python基礎入門教程:傳參是傳值還是傳引用

python基礎入門教程:傳參是傳值還是傳引用

在此之前先來看看變數和物件的關係:Python 中一切皆為物件,數字是物件,列表是物件,函式也是物件,任何東西都是物件。而變數是物件的一個引用(又稱為名字或者標籤),物件的操作都是通過引用來完成的。例如,a = []是一個空列表物件,變數 a 是該物件的一個引用
例1

def test(c):
 c.append("hello world")
 print(c,id(c))
 return
list = [1,2]
test(list)
print(list,id(list))

輸出

[1, 2, 'hello world'] 2463790879240
[1, 2, 'hello world'] 2463790879240

在執行test函式前,列表list和引數c都指向同一個物件,執行test時並沒有重新賦值,也沒有新的指向過程,append方法只是對列表物件插入一個元素,物件還是原來的物件,只是物件裡面的內容變了,因為引數c和列表list都是繫結同一個物件上,執行c.append和list.append方法本質都是對一個物件進行操作,因此list列表在呼叫函式後發生了變化,但id沒變,還是原來那個物件。因此,如果函式收到的是一個可變物件(比如字典或者列表)的引用,就能修改物件的原始值--相當於通過“傳引用”來傳遞物件

例2

#Python學習交流群:778463939

def test2(p):
p = "i in test2"
print(p,id(p))
str = "hello word"
test2(str)
print(str,id(str))

輸出:

i in test2 2885210784112
hello word 2885210784048

id不一樣,所以說不是同一個物件,也就是說我們傳的還是引用。因此,如果函式收到的是一個不可變物件(比如數字、字元或者元組)的引用,就不能直接修改原始物件--相當於通過“傳值'來傳遞物件。

總結:

Python引數傳遞採用的肯定是“傳物件引用”的方式。這種方式相當於傳值和傳引用的一種綜合。如果函式收到的是一個可變物件(比如字典或者列表)的引用,就能修改物件的原始值--相當於通過“傳引用”來傳遞物件。如果函式收到的是一個不可變物件(比如數字、字元或者元組)的引用,就不能直接修改原始物件--相當於通過“傳值'來傳遞物件。