1
在編程語言中,函數(shù)定義時用的是形參,調(diào)用時用的是實參。
形參,全稱為"形式參數(shù)",不是實際存在的變量,又稱虛擬變量。形參是在定義函數(shù)名和函數(shù)體的時候使用的參數(shù),目的是用來接收調(diào)用該函數(shù)時傳入的參數(shù)。
實參,全稱為"實際參數(shù)",是在調(diào)用時傳遞給函數(shù)的參數(shù)。實參可以是常量、變量、表達式、函數(shù)等。無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。
形參和實參的功能是數(shù)據(jù)傳送。
2
在調(diào)用函數(shù)時,實參將賦值給形參。必須注意實參的個數(shù)、類型應(yīng)與形參要一一對應(yīng),并且實參必須要有確定的值。形參的作用域一般僅限函數(shù)體內(nèi)部,而實參的作用域根據(jù)實際設(shè)置而定。
Python語言中提供了一種關(guān)鍵字參數(shù)的機制,可以給開發(fā)者提供更大的靈活性。如函數(shù)func()定義時形式參數(shù)的順序是func(x, y),但是調(diào)用時實際參數(shù)的順序可以是func(y = 1, x = 2)。
3
在函數(shù)調(diào)用中,實參的值被傳遞給函數(shù)的形參。這個過程確實涉及到將一個值賦給一個變量,因此可以看作是一種賦值操作。實參的值被賦給相應(yīng)的形參,使得函數(shù)在執(zhí)行時可以使用這些值。
然而,傳遞參數(shù)的過程與一般的賦值操作還有一些不同之處:
1形參和實參是獨立的變量:當(dāng)實參的值傳遞給形參時,它們在內(nèi)存中是獨立的變量。修改形參的值不會影響實參的值,因為它們是兩個不同的變量。
2傳遞方式:參數(shù)傳遞可以是按值傳遞(pass-by-value)或按引用傳遞(pass-by-reference),這取決于編程語言的特性。在按值傳遞的情況下,實參的值被復(fù)制到形參中,對形參的修改不會影響實參。而在按引用傳遞的情況下,實參的引用(地址)被傳遞給形參,對形參的修改會影響實參。
在Python中,實際上是按對象引用傳遞(pass-by-object-reference)的,而不是按引用傳遞。這意味著對象的引用被傳遞給函數(shù)的形參,形參和實參引用同一個對象。實參的引用被傳遞給形參,函數(shù)內(nèi)部可以通過形參來訪問和修改實參所引用的對象。當(dāng)傳遞可變對象(如列表或字典)時,對形參對象的修改會影響實參。但是當(dāng)傳遞不可變對象(如數(shù)字、字符串或元組)時,形參的修改不會影響實參,因為不可變對象是無法修改的。
注意,對可變對象的修改是指對可變對象的原地修改。
Python的參數(shù)引用機制被認為是其設(shè)計的亮點之一。
通過按對象引用傳遞參數(shù),Python能夠在函數(shù)調(diào)用過程中高效地處理對象,同時提供了靈活性和直觀性。以下是一些Python參數(shù)引用機制的優(yōu)點:
1對象共享:通過引用傳遞,多個變量可以引用相同的對象。這意味著可以節(jié)省內(nèi)存,并且對于可變對象,多個變量可以同時對其進行操作。
2不可變對象的安全性:對于不可變對象(如數(shù)字、字符串、元組),保證了其值不會被函數(shù)修改,從而避免了潛在的副作用。
3可變對象的直接修改:對于可變對象(如列表、字典),函數(shù)內(nèi)部對形參對象的修改會直接反映在實參上,無需使用返回值來獲取修改后的結(jié)果。
4函數(shù)副作用控制:由于參數(shù)傳遞是按對象引用傳遞的,函數(shù)可以通過修改可變對象來產(chǎn)生副作用,但對于不可變對象,函數(shù)無法修改實參的值。
4
參數(shù)分為可變類型和不可變類型,其調(diào)用結(jié)果是不同的。
(1)可變類型:類似c++的引用傳遞,如列表、字典等。如果傳遞的參數(shù)是可變類型,則在函數(shù)內(nèi)部對傳入?yún)?shù)的修改會影響到外部變量。
(2)不可變類型:類似c++的值傳遞,如整數(shù)、字符串、元組等。如果傳遞的參數(shù)是不可變類型,則在函數(shù)內(nèi)部對傳入?yún)?shù)的修改不會影響到外部變量。
5
可給每個形參指定默認值。
def enroll(name, gender, age='18', city='Beijing'):
定義時必選參數(shù)在前,默認參數(shù)在后。默認參數(shù)在調(diào)用時可省略。
默認參數(shù)必須指向不可變對象,否則可能會出現(xiàn)錯誤:
def test_add(a=[]):
????a.append('END')
????return a
print(test_add([1, 2, 3]))
print(test_add(['a', 'b', 'c']))
print(test_add())
print(test_add())
print(test_add())
結(jié)果:
[1, 2, 3, 'END']
['a', 'b', 'c', 'END']
['END']
['END', 'END']
['END', 'END', 'END']
默認參數(shù)是空列表[],但是函數(shù)test_add()似乎每次都“記住了”上次添加了’END’后的list。這是因為在Python語言中,函數(shù)在定義的時候,默認參數(shù)的值就被計算出來了,它指向?qū)ο骩]。每次調(diào)用該函數(shù),如果改變了其內(nèi)容,則下次調(diào)用時,就不再是函數(shù)定義時的[]了。
開發(fā)者也可以用None這個不可變對象來解決錯誤,如下代碼所示。
def test_add(H=None):
????if H is None:
????????H = []
????H.append('END')
????return H
print(test_add())
print(test_add())
結(jié)果:
['END']
['END']
對于str、None等類似的不可變對象一旦創(chuàng)建,其內(nèi)部數(shù)據(jù)就不能修改,這樣就減少了由于修改數(shù)據(jù)導(dǎo)致的錯誤。此外,由于對象不變,多線程環(huán)境下同時讀取對象不需要加鎖,同時讀也沒有問題。開發(fā)者在編寫程序時,如果可以設(shè)計一個不可變對象,就盡量設(shè)計成不可變對象。
6
is 是一個用于比較對象身份的操作符。它用于檢查兩個對象是否引用同一個內(nèi)存位置,也就是它們是否是同一個對象。具體來說,當(dāng)使用 is 操作符時,它會檢查兩個對象的身份標識是否相同,而不是比較它們的值。如果兩個對象具有相同的身份標識,即它們引用同一個內(nèi)存地址,則 is 操作符返回 True。如果兩個對象的身份標識不同,則返回 False。文章來源:http://www.zghlxwxcb.cn/news/detail-785742.html
a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(a is b) ?# 輸出 True,a和b引用同一個列表對象
print(a is c) ?# 輸出 False,a和c引用不同的列表對象
需要注意的是,is 操作符用于比較對象的身份標識,而 == 操作符用于比較對象的值。文章來源地址http://www.zghlxwxcb.cn/news/detail-785742.html
到了這里,關(guān)于python中的形參和實參以及參數(shù)傳遞方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!