在c系列語言中,參數的傳遞方式有值傳遞與引用傳遞,而python的參數傳遞方式是賦值傳遞,或者稱為對象的引用傳遞。python里的所有數據類型都是對象,所有參數傳遞時,只是讓新變量與原變量指向相同的對象而已,並不存在值傳遞與引用傳遞的說法。
1.python變量及其賦值
如下代碼示例:
1 a = 10 2 b = a 3 a = 20
在這一過程中,python會先執行右邊的表達式,即先在內存中創建一個數值,然后再執行左邊,創建一個標簽,這個標簽相當於一個便利貼,最后再將標簽指向內存。第一行所做的事情如下圖:

第二行代碼開始進行如下處理:

第三行代碼處理如下:

2.python的參數傳遞
如下示例:
1 def func(d): 2 d['a'] = 10 3 d['b'] = 20 4 d = {'a':1, 'b':2} 5 print(d) #輸出{'a':1, 'b':2} 6 7 d = {} 8 func(d) 9 print(d) #輸出{'a': 10, 'b': 20}
在上面的代碼中,當我們將d傳給func時,func里面的d與外面的d指向的是同一片內存。相當於一開始d={},存放{}這份空間只有d這一個便利貼,但是func(d)的時候,這份空間又多了一個便利貼。盡管都叫d,但一個是全局變量d,一個是函數的參數d。
當d['a'] = 10和d['b']=20的時候,由於字典是可變類型,所以外面的d也被修改了,此時外面的d和函數里面的d都指向了{'a': 10, 'b': 20}, 但是當d = {'a': 1, 'b': 2}的時候,這是屬於賦值。因此python會在內存中再開辟一份空間,空間存放{'a': 1, 'b': 2},然后讓函數里面的局部變量d指向它,相當於將原本位於{'a':10,'b':20}上的便利貼撕下來,貼在了另一塊空間。但這只是函數里面的d,對外面的d是沒有影響的,所以外面的d依舊是{'a': 10, 'b': 20}。
參考:1.https://www.cnblogs.com/scolia/p/5523883.html
2.極客時間《python核心技術與實戰》
