python中的值傳遞和引用傳遞

來源:互聯網
上載者:User

標籤:局部變數   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中的值傳遞和引用傳遞

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.