標籤:局部變數 str 類型 函數參數 number reference font class 指標
Python中的變數是沒有類型的,我們可以把它看做一個(*void)類型的指標,變數是可以指向任何對象的,而對象才是有類型的。
Python中的對象有可變對象(number,string,tuple等)和不可變對象之分(list,dict等)。
值傳遞(passl-by-value)過程中,被調函數的形式參數作為被調函數的局部變數處理,即在堆棧中開闢了記憶體空間以存放由主調函數放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變數進行,不會影響主調函數的實參變數的值。(被調函數新開闢記憶體空間存放的是實參的副本值)
引用傳遞(pass-by-reference)過程中,被調函數的形式參數雖然也作為局部變數在堆棧中開闢了記憶體空間,但是這時存放的是由主調函數放進來的實參變數的地址。被調函數對形參的任何操作都被處理成間接定址,即通過堆棧中存放的地址訪問主調函數中的實參變數。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變數。(被調函數新開闢記憶體空間存放的是實參的地址)
1. 不可變對象作為函數參數,相當於C語言的值傳遞。
1 def test(c): 2 print("test before ") 3 print(id(c)) #一開始傳遞進來的是對不可變資料類型a(數字類型)的引用 4 c += 2 #數字改變後有一個新的指標指向3所在記憶體空間,但原來指向2的指標a(記憶體位址空間依舊存在)未改變 5 print("test after ") 6 print(id(c)) #故c的記憶體位址改變 7 return c 8 9 10 if __name__ == "__main__":11 a = 212 print(id(a))13 n = test(a) #414 print(a) #215 print(id(a))
1 最終2 輸出的值為3 15479160964 test before 5 15479160966 test after 7 15479161608 29 1547916096
2. 可變對象作為函數參數,相當於C語言的引用傳遞。(因列表是可變資料類型,作為參數傳遞實則是傳遞對列表的引用,修改更新列表值後依舊引用不變)
1 def test(list2): 2 print("test before ") 3 print(id(list2)) #221 4 list2[1] = 30 5 print("test after ") 6 print(id(list2)) #221 7 return list2 8 9 if __name__ == "__main__":10 list1 = ["loleina", 25, ‘female‘]11 print(id(list1)) #22112 list3 = test(list1)13 print(list1) #["loleina",30, ‘female‘]14 print(id(list1)) #22115 print(id(list3))
1 171921362 test before 3 171921364 test after 5 171921366 [‘loleina‘, 30, ‘female‘]7 171921368 17192136
python中的值傳遞和引用傳遞