開發與維運

實參的類型 | Python從入門到精通:高階篇之四

參數傳遞的方式 | Python從入門到精通:高階篇之三

實參的類型

創建函數

def fn2(a):
    print('a =',a)

fn2(123)

執行結果:

image.png

def fn2(a):
    print('a =',a)

#b=123
a= 123
#fn2(b)
fn(a)

執行結果:

image.png
image.png

其中形參的a跟函數外面的a,並沒有關係,並不會被覆蓋掉,之後我們會有詳細的解釋。

函數在調用時,解析器不會檢查實參的類型,實參可以傳遞任意類型的對象。

def fn2(a):
    print('a =',a)

b = True
b = 'hello'
b = None
b = [1,2,3]
#fn2(b)

fn2(fn)

執行結果:

image.png
image.png
image.png
image.png
image.png

我們可以去調用這個函數。

def fn2(a):
    print('a =',a)
    a(1,2,3)

fn2(fn)

執行結果:

image.png

可以發現,fn是之前定義的一個函數,我們執行fn2(fn),並不是調用fn2(fn()),所以執行的結果是a是一個函數。所以實參可以傳遞任意類型的對象,數字、布爾值、字符串、列表、函數等都可以。

但是這其中也會有一些問題。

def fn3(a , b):
    print(a+b)

#fn3(123,456)
fn3(123,"456")

執行結果:

image.png
image.png

我們可以得出,不支持int與str相加的操作,會導致程序出錯,所以我們在傳遞參數的時候需要注意參數的類型。當然之後我們會有異常的檢查,但當下我們需要注意在定義函數的時候需要儘量去將函數設置完整,檢查類型,在傳遞參數的時候明確所要傳遞的類型的實參。

定義一個函數fn4
在每一個函數參數都是獨立的,每個形參都只是在其本身的函數是有作用的。所以不同函數之間相同的形參並不影響。

def fn4(a):
     print('a =',a)

c = 10 
fn4(c)

print('c =',c)

執行結果:

image.png
image.png

在函數之外打印出的結果與函數輸出的結果一致,現在針對於函數中的a重新賦值。

def fn4(a):
     a = 20
     print('a =',a)

c = 10 
fn4(c)

print('c =',c)

執行結果:

image.png

在函數中對形參進行重新賦值,不會影響其他的變量。
針對上面的函數再次做出修改:

def fn4(a):
    # a = 20
    # a是一個列表,嘗試修改列表中的元素,此時所改的是對象
    # 如果形參指向的是一個對象,當我們通過形參去修改對象時
    #   會影響到所有指向該對象的變量
     a[0] = 30
     print('a =',a)

c = 10 
c = [1,2,3] 
fn4(c)

print('c =',c)

執行結果:

image.png
image.png

我們可以通過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))

執行結果:

image.png

所以我們修改的時候需要注意所修改的是變量還是對象,避免對程序造成影響。
如果想要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))

執行結果:

image.png

當然,也可以有別的解決方式,通過切片來解決。

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))

執行結果:

image.png

配套視頻課程,點擊這裡查看

獲取更多資源請訂閱Python學習站

Leave a Reply

Your email address will not be published. Required fields are marked *