python基礎05 函式引數的傳遞以及淺拷貝問題

2021-10-07 08:14:55 字數 3141 閱讀 4170

東陽的學習記錄,堅持就是勝利!

深拷貝和淺拷貝

位置引數

預設值引數(預設值引數必須位於普通引數後面)

命名引數(在傳參時指定引數型別)

可變引數:

*param(乙個星號),將多個引數收集到乙個「元組」物件中。

**param(兩個星號),將多個引數收集到乙個「字典」物件中。

強制命名引數(在帶星號的「可變引數」後面增加新的引數,必須在呼叫的時候「強制命名引數」。)

函式的引數傳遞本質上就是:從實參到形參的賦值操作。 python 中「一切皆物件」,所有的賦值操作都是「引用的賦值」。所以,python 中引數的傳遞都是「引用傳遞」,不是「值傳遞」。具體操作時分為兩類:

對「可變物件」進行「寫操作」,直接作用於原物件本身。

對「不可變物件」進行「寫操作」,會產生乙個新的「物件空間」,並用新的值填充這塊空間。(起到其他語言的「值傳遞」效果,但不是「值傳遞」)

可變物件有:

字典、列表、集合、自定義的物件等

不可變物件有:

數字、字串、元組、function 等

傳遞引數是可變物件(例如:列表、字典、自定義的其他可變物件等),實際傳遞的還是物件的引用。在函式體中不建立新的物件拷貝,而是可以直接修改所傳遞的物件。(這個和c中傳遞指標一樣)

b =[10

,20]def

f2(m)

:print

("m:",id

(m))

#b 和 m 是同乙個物件30)

#由於 m 是可變物件,不建立物件拷貝,直接修改這個物件b:

f2(b)

print

("b:",id

(b))

print

(b)執行結果:

m:45765960

b:45765960[10

,20,30

]

傳遞引數是不可變物件(例如:int、float、字串、元組、布林值),實際傳遞的還是物件的引用。在」賦值操作」時,由於不可變物件無法修改,系統會新建立乙個物件。(不會修改原傳入引數,在對傳入的不可變物件進行修改操作時,會新建乙個新的物件。)

a =

100def

f1(n)

:print

("n:",id

(n))

#傳遞進來的是 a 物件的位址

n = n+

200#由於 a 是不可變物件,因此建立新的物件 n

print

("n:",id

(n))

#n 已經變成了新的物件

print

(n)f1(a)

print

("a:",id

(a))

執行結果:

n:1663816464

n:46608592

300a:

1663816464

顯然,通過 id 值我們可以看到 n 和 a 一開始是同乙個物件。給 n 賦值後,n 是新的物件。

# 不可變物件

a =100

deff1

(n):

print

("n:",id

(n))

#傳遞進來的是 a 物件的位址

n = n+

200#由於 a 是不可變物件,因此建立新的物件 n

print

("n:",id

(n))

#n 已經變成了新的物件

# print(n)

f1(a)

print

("a:",id

(a))

執行結果:

a: 41611632

m: 41611632

(10, 20, [888, 6])

m: 41611632

(10, 20, [888, 6])

為了更深入的了解引數傳遞的底層原理,我們需要講解一下「淺拷貝和深拷貝」。我們可以使用內建函式:copy(淺拷貝)、deepcopy(深拷貝)。

# 淺拷貝和深拷貝

import copy

deftestcopy()

:'''測試淺拷貝'''

a =[10

,20,[

5,6]

] b = copy.copy(a)

print

("a"

, a)

print

("b"

, b)30)

b[2]

7)print

("淺拷貝......"

)print

("a"

, a)

print

("b"

, b)

deftestdeepcopy()

:'''測試深拷貝'''

a =[10

,20,[

5,6]

]# 深拷貝

b = copy.deepcopy(a)

print

("a"

, a)

print

("b"

, b)30)

b[2]

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]

Python基礎 函式 函式引數

引數就是傳入的值 示例 usr bin env python3 coding utf 8 函式的引數和預設引數 defregist name,age,city shenzhen print name name print age age print city city 執行結果 d pythonpr...

Python基礎(函式引數)

1.必選引數parameter def detail1 name,age,tel print 姓名 name print 年齡 age print tel detail1 qiye 12 123456 2.預設引數parameter value def detail2 name,age,tel,ge...

Python基礎之函式的引數

在學習python過程中感謝廖雪峰的 def 函式名 引數1 引數2 引數3.函式體 returnpython函式的建立非常簡單,但是靈活度卻非常大。因此寫下此篇文章用於鞏固學習。首先我們定義乙個求乙個數的平方 def getresult x return x x此時引數x 即為位置引數,當我們呼叫...