在此以前先來看看變量和對象的關係:Python 中一切皆爲對象,數字是對象,列表是對象,函數也是對象,任何東西都是對象。而變量是對象的一個引用(又稱爲名字或者標籤),對象的操做都是經過引用來完成的。例如,a = []是一個空列表對象,變量 a 是該對象的一個引用
例1python
def test(c): c.append("hello world") print(c,id(c)) return list = [1,2] test(list) print(list,id(list))
輸出app
[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))
輸出:code
i in test2 2885210784112 hello word 2885210784048
id不同,因此說不是同一個對象,也就是說咱們傳的仍是引用。所以,若是函數收到的是一個不可變對象(好比數字、字符或者元組)的引用,就不能直接修改原始對象--至關於經過「傳值'來傳遞對象。對象
總結:class
Python參數傳遞採用的確定是「傳對象引用」的方式。這種方式至關於傳值和傳引用的一種綜合。若是函數收到的是一個可變對象(好比字典或者列表)的引用,就能修改對象的原始值--至關於經過「傳引用」來傳遞對象。若是函數收到的是一個不可變對象(好比數字、字符或者元組)的引用,就不能直接修改原始對象--至關於經過「傳值'來傳遞對象。test