Python參數的傳遞幾種情況實例詳解
一、參數的傳遞
函數的參數傳遞本質上就是:從實參到形參的賦值操作。Python中“一切皆對象”,所有的賦值操作都是“引用的賦值”。所以,Python中參數的傳遞都是“引用傳遞”,不是“值傳遞”。
具體操作時分為兩類:
對“可變對象”進行“寫操作”,直接作用于原對象本身。對“不可變對象”進行“寫操作”,會產生一個新的“對象空間”,并用新的值填充這塊空間。
可變對象有:
字典、列表、集合、自定義的對象等
不可變對象有:
數字、字符串、元組、function等
二、傳遞可變對象的引用
傳遞參數是可變對象(例如:列表、字典、自定義的其他可變對象等),實際傳遞的還是對象的引用。在函數體中不創(chuàng)建新的對象拷貝,而是可以直接修改所傳遞的對象。
【操作】參數傳遞:傳遞可變對象的引用
b = [10,20] def f2(m): print("m:",id(m)) #b和m是同一個對象 m.append(30) #由于m是可變對象,不創(chuàng)建對象拷貝,直接修改這個對象 ? f2(b) print("b:",id(b)) print(b)
執(zhí)行結果:
m: 45765960
b: 45765960
[10, 20, 30]
三、傳遞不可變對象的引用
傳遞參數是不可變對象(例如: int
、 float
、字符串、元組、布爾值),實際傳遞的還是對象的引用。在”賦值操作”時,由于不可變對象無法修改,系統(tǒng)會新創(chuàng)建一個對象。
【操作】參數傳遞:傳遞不可變對象的引用
a = 100 def f1(n): print("n:",id(n)) #傳遞進來的是a對象的地址 n = n+200 #由于a是不可變對象,因此創(chuàng)建新的對象n print("n:",id(n)) #n已經變成了新的對象 print(n) f1(a) print("a:",id(a))
執(zhí)行結果:
n: 1663816464
n: 46608592
300
a: 1663816464
顯然,通過 id
值我們可以看到 n
和 a
一開始是同一個對象。給n賦值后,n是新的對象。
四、淺拷貝和深拷貝
為了更深入的了解參數傳遞的底層原理,我們需要講解一下“淺拷貝和深拷貝”。我們可以使用內置函數: copy
(淺拷貝)、 deepcopy
(深拷貝)。
- 淺拷貝:拷貝對象,但不拷貝子對象的內容,只是拷貝子對象的引用。
- 深拷貝:拷貝對象,并且會連子對象的內存也全部(遞歸)拷貝一份,對子對象的修改不會影響源對象
#測試淺拷貝和深拷貝 import copy ? def testCopy(): '''測試淺拷貝''' a = [10, 20, [5, 6]] b = copy.copy(a) ? print("a", a) print("b", b) b.append(30) b[2].append(7) print("淺拷貝......") print("a", a) print("b", b) ? def testDeepCopy(): '''測試深拷貝''' a = [10, 20, [5, 6]] b = copy.deepcopy(a) ? print("a", a) print("b", b) b.append(30) b[2].append(7) print("深拷貝......") print("a", a) print("b", b) ? testCopy() print("*************") testDeepCopy()
運行結果:
a [10, 20, [5, 6]]
b [10, 20, [5, 6]]
淺拷貝......
a [10, 20, [5, 6, 7]]
b [10, 20, [5, 6, 7], 30]
a [10, 20, [5, 6]]
b [10, 20, [5, 6]]
深拷貝......
a [10, 20, [5, 6]]
b [10, 20, [5, 6, 7], 30]
五、傳遞不可變對象包含的子對象是可變的情況
#傳遞不可變對象時。不可變對象里面包含的子對象是可變的。則方法內修改了這個可變對象,源對象也發(fā)生了變化。 ? a = (10,20,[5,6]) print("a:",id(a)) ? def test01(m): print("m:",id(m)) m[2][0] = 888 print(m) print("m:",id(m)) ? test01(a) print(a)
運行結果:
a: 41611632
m: 41611632
(10, 20, [888, 6])
m: 41611632
(10, 20, [888, 6])
總結
到此這篇關于Python參數的傳遞幾種情況的文章就介紹到這了,更多相關Python參數傳遞內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用matplotlib的pie函數繪制餅狀圖功能示例
這篇文章主要介紹了Python使用matplotlib的pie函數繪制餅狀圖功能,結合實例形式分析了Python使用matplotlib的pie函數進行餅狀圖繪制的具體操作技巧,注釋中對pie函數的用法進行了詳細的說明,便于理解,需要的朋友可以參考下2018-01-01Python使用Apache Kafka時Poll拉取速度慢的解決方法
在使用Apache Kafka時,poll方法拉取消息速度慢常見于網絡延遲、消息大小過大、消費者配置不當或高負載情況,本文提供了優(yōu)化消費者配置、并行消費、優(yōu)化消息處理邏輯和監(jiān)控調試的解決方案,并附有Python代碼示例和相關類圖、序列圖以幫助理解和實現(xiàn)2024-09-09Diango + uwsgi + nginx項目部署的全過程(可外網訪問)
這篇文章主要給大家介紹了關于Diango + uwsgi + nginx項目部署的全過程(可外網訪問),文中通過示例代碼將部署的過程介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-04-04