東陽的學習記錄,堅持就是勝利!
深拷貝和淺拷貝
位置引數
預設值引數(預設值引數必須位於普通引數後面)
命名引數(在傳參時指定引數型別)
可變引數:
*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 即為位置引數,當我們呼叫...