1. 程式人生 > 其它 >Python 預設引數

Python 預設引數

目錄

一、問題

定義有預設引數的函式。



二、解決方案

def test(a, b=2):
	print(a, b)
test(1)
test(1, 3)

輸出:

1 2
1 3

預設引數是可修改的容器,如:列表、字典、集合,可以用 None 作為預設值。

def test(a, b=None):
    if b is None:
        b = []
    ...

並不想提供一個預設值,僅測試預設引數是不是傳進來。

測試引數是否被傳遞進來,不能 None、0、False值,因為這些值都是合法的,需要建立一個獨一無二的私有物件例項。如:object 類的例項 object()

_no_value = object()
def test(a, b=_no_value):
    if b is _no_value:
        print('b值沒有傳進來。')
    else:
        print(b)

test(1)
test(1, None)

輸出:

b值沒有傳進來。
None

傳遞一個 None 值和不傳值兩種情況不同。



三、討論

預設引數的值僅在函式定義的時候賦值一次。

x = 2
def test(a, b=x):
    print(a, b)
test(1)

x = 3
test(1)

輸出:

1 2
1 2

改變 x 的值對預設引數值沒影響,因為在函式定義的時候已經確定了它的預設值。


預設引數的值是不可改變的物件。

def test(a, b=[]):
    return b

t = test(1)
print(t)

t.append(2)
t.append('wangke')
print(t)

輸出:

[]

[2, 'wangke']

上面示例,b 的預設值是可改變物件,對 b 進行修改,下次呼叫這個函式預設值會改變。

為避免這種情況,將預設值設為 None。