如何在 Python 函數中使用和注意默認參數

商業

如果在函數調用期間省略參數,在 Python 函數定義中設置默認參數會導致使用默認值。

以下詳細說明如下。

  • 設置默認參數
  • 對默認參數位置的約束
  • 請注意,當使用列表或字典作為默認值時

設置默認參數

如果函數定義中的參數名稱=默認值,則在省略相應參數時將使用默認值。

def func_default(arg1, arg2='default_x', arg3='default_y'):
    print(arg1)
    print(arg2)
    print(arg3)

func_default('a')
# a
# default_x
# default_y

func_default('a', 'b')
# a
# b
# default_y

func_default('a', arg3='c')
# a
# default_x
# c

對默認參數位置的約束

定義函數時將默認參數放在普通參數(未指定默認值的參數)之前會導致錯誤。
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

請注意,當使用列表或字典作為默認值時

如果將諸如列表或字典之類的可更新(可變)對象指定為默認值,則將在定義函數時創建該對象。然後,當函數在沒有相應參數的情況下被調用時,將使用相同的對象。

執行函數定義時,從左到右計算默認參數值。這意味著默認參數表達式僅在定義函數時計算一次,並且每次調用都使用相同的“計算”值。
8.7. Function definitions — Python 3.10.2 Documentation

因此,例如,如果定義了一個函數,該函數將列表或字典作為其默認參數並向其添加元素,並且在沒有該參數的情況下多次調用,則元素將被重複添加到同一個對像中。

列表示例。

def func_default_list(l=[0, 1, 2], v=3):
    l.append(v)
    print(l)

func_default_list([0, 0, 0], 100)
# [0, 0, 0, 100]

func_default_list()
# [0, 1, 2, 3]

func_default_list()
# [0, 1, 2, 3, 3]

func_default_list()
# [0, 1, 2, 3, 3, 3]

字典的例子。

def func_default_dict(d={'default': 0}, k='new', v=100):
    d[k] = v
    print(d)

func_default_dict()
# {'default': 0, 'new': 100}

func_default_dict(k='new2', v=200)
# {'default': 0, 'new': 100, 'new2': 200}

每次調用該函數時都會創建一個新對象。

def func_default_list_none(l=None, v=3):
    if l is None:
        l = [0, 1, 2]
    l.append(v)
    print(l)

func_default_list_none()
# [0, 1, 2, 3]

func_default_list_none()
# [0, 1, 2, 3]