參數傳遞的方式 | Python從入門到精通:高階篇之三
實參的類型
創建函數
def fn2(a):
print('a =',a)
fn2(123)
執行結果:
def fn2(a):
print('a =',a)
#b=123
a= 123
#fn2(b)
fn(a)
執行結果:
其中形參的a跟函數外面的a,並沒有關係,並不會被覆蓋掉,之後我們會有詳細的解釋。
函數在調用時,解析器不會檢查實參的類型,實參可以傳遞任意類型的對象。
def fn2(a):
print('a =',a)
b = True
b = 'hello'
b = None
b = [1,2,3]
#fn2(b)
fn2(fn)
執行結果:
我們可以去調用這個函數。
def fn2(a):
print('a =',a)
a(1,2,3)
fn2(fn)
執行結果:
可以發現,fn是之前定義的一個函數,我們執行fn2(fn),並不是調用fn2(fn()),所以執行的結果是a是一個函數。所以實參可以傳遞任意類型的對象,數字、布爾值、字符串、列表、函數等都可以。
但是這其中也會有一些問題。
def fn3(a , b):
print(a+b)
#fn3(123,456)
fn3(123,"456")
執行結果:
我們可以得出,不支持int與str相加的操作,會導致程序出錯,所以我們在傳遞參數的時候需要注意參數的類型。當然之後我們會有異常的檢查,但當下我們需要注意在定義函數的時候需要儘量去將函數設置完整,檢查類型,在傳遞參數的時候明確所要傳遞的類型的實參。
定義一個函數fn4
在每一個函數參數都是獨立的,每個形參都只是在其本身的函數是有作用的。所以不同函數之間相同的形參並不影響。
def fn4(a):
print('a =',a)
c = 10
fn4(c)
print('c =',c)
執行結果:
在函數之外打印出的結果與函數輸出的結果一致,現在針對於函數中的a重新賦值。
def fn4(a):
a = 20
print('a =',a)
c = 10
fn4(c)
print('c =',c)
執行結果:
在函數中對形參進行重新賦值,不會影響其他的變量。
針對上面的函數再次做出修改:
def fn4(a):
# a = 20
# a是一個列表,嘗試修改列表中的元素,此時所改的是對象
# 如果形參指向的是一個對象,當我們通過形參去修改對象時
# 會影響到所有指向該對象的變量
a[0] = 30
print('a =',a)
c = 10
c = [1,2,3]
fn4(c)
print('c =',c)
執行結果:
我們可以通過id去判斷:可以發現id是一樣的。
def fn4(a):
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
fn4(c)
print('c =',c,id(c))
執行結果:
所以我們修改的時候需要注意所修改的是變量還是對象,避免對程序造成影響。
如果想要a與c是相互獨立的,一個改變對另外一個沒有影響,我們可以通過淺複製來解決,傳遞c的副本。
def fn4(a):
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
#fn4(c)
fn4(c.copy())
print('c =',c,id(c))
執行結果:
當然,也可以有別的解決方式,通過切片來解決。
def fn4(a):
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
#fn4(c)
#fn4(c.copy())
fn4(c[:])
print('c =',c,id(c))
執行結果:
配套視頻課程,點擊這裡查看
獲取更多資源請訂閱Python學習站