Python參數(shù)的傳遞幾種情況實(shí)例詳解
一、參數(shù)的傳遞
函數(shù)的參數(shù)傳遞本質(zhì)上就是:從實(shí)參到形參的賦值操作。Python中“一切皆對(duì)象”,所有的賦值操作都是“引用的賦值”。所以,Python中參數(shù)的傳遞都是“引用傳遞”,不是“值傳遞”。
具體操作時(shí)分為兩類:
對(duì)“可變對(duì)象”進(jìn)行“寫操作”,直接作用于原對(duì)象本身。對(duì)“不可變對(duì)象”進(jìn)行“寫操作”,會(huì)產(chǎn)生一個(gè)新的“對(duì)象空間”,并用新的值填充這塊空間。
可變對(duì)象有:
字典、列表、集合、自定義的對(duì)象等
不可變對(duì)象有:
數(shù)字、字符串、元組、function等
二、傳遞可變對(duì)象的引用
傳遞參數(shù)是可變對(duì)象(例如:列表、字典、自定義的其他可變對(duì)象等),實(shí)際傳遞的還是對(duì)象的引用。在函數(shù)體中不創(chuàng)建新的對(duì)象拷貝,而是可以直接修改所傳遞的對(duì)象。
【操作】參數(shù)傳遞:傳遞可變對(duì)象的引用
b = [10,20]
def f2(m):
print("m:",id(m)) #b和m是同一個(gè)對(duì)象
m.append(30) #由于m是可變對(duì)象,不創(chuàng)建對(duì)象拷貝,直接修改這個(gè)對(duì)象
?
f2(b)
print("b:",id(b))
print(b)執(zhí)行結(jié)果:
m: 45765960
b: 45765960
[10, 20, 30]
三、傳遞不可變對(duì)象的引用
傳遞參數(shù)是不可變對(duì)象(例如: int 、 float 、字符串、元組、布爾值),實(shí)際傳遞的還是對(duì)象的引用。在”賦值操作”時(shí),由于不可變對(duì)象無法修改,系統(tǒng)會(huì)新創(chuàng)建一個(gè)對(duì)象。
【操作】參數(shù)傳遞:傳遞不可變對(duì)象的引用
a = 100
def f1(n):
print("n:",id(n)) #傳遞進(jìn)來的是a對(duì)象的地址
n = n+200 #由于a是不可變對(duì)象,因此創(chuàng)建新的對(duì)象n
print("n:",id(n)) #n已經(jīng)變成了新的對(duì)象
print(n)
f1(a)
print("a:",id(a))執(zhí)行結(jié)果:
n: 1663816464
n: 46608592
300
a: 1663816464
顯然,通過 id 值我們可以看到 n 和 a 一開始是同一個(gè)對(duì)象。給n賦值后,n是新的對(duì)象。
四、淺拷貝和深拷貝

為了更深入的了解參數(shù)傳遞的底層原理,我們需要講解一下“淺拷貝和深拷貝”。我們可以使用內(nèi)置函數(shù): copy (淺拷貝)、 deepcopy (深拷貝)。
- 淺拷貝:拷貝對(duì)象,但不拷貝子對(duì)象的內(nèi)容,只是拷貝子對(duì)象的引用。
- 深拷貝:拷貝對(duì)象,并且會(huì)連子對(duì)象的內(nèi)存也全部(遞歸)拷貝一份,對(duì)子對(duì)象的修改不會(huì)影響源對(duì)象
#測(cè)試淺拷貝和深拷貝
import copy
?
def testCopy():
'''測(cè)試淺拷貝'''
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():
'''測(cè)試深拷貝'''
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()運(yùn)行結(jié)果:
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]
五、傳遞不可變對(duì)象包含的子對(duì)象是可變的情況
#傳遞不可變對(duì)象時(shí)。不可變對(duì)象里面包含的子對(duì)象是可變的。則方法內(nèi)修改了這個(gè)可變對(duì)象,源對(duì)象也發(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)運(yùn)行結(jié)果:
a: 41611632
m: 41611632
(10, 20, [888, 6])
m: 41611632
(10, 20, [888, 6])
總結(jié)
到此這篇關(guān)于Python參數(shù)的傳遞幾種情況的文章就介紹到這了,更多相關(guān)Python參數(shù)傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python統(tǒng)計(jì)mysql數(shù)據(jù)量變化并調(diào)用接口告警的示例代碼
這篇文章主要介紹了python統(tǒng)計(jì)mysql數(shù)據(jù)量變化并調(diào)用接口告警的示例代碼,幫助大家更好的利用python操作數(shù)據(jù)庫,感興趣的朋友可以了解下2020-09-09
PyQt6/PySide6中QTableView類的實(shí)現(xiàn)
本文主要介紹了PyQt6/PySide6中QTableView類的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
Python整數(shù)對(duì)象實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Python整數(shù)對(duì)象實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

