Pythonで関数を定義するときのパラメータにデフォルト値がある小さなトラップ

1283 ワード

関数を定義するとき、関数のパラメータにデフォルト値がある場合、整数、文字列という可変タイプとリストという可変タイプの2種類のパラメータがあります.1つはリストという可変タイプで、1つ目の場合には特別な場所はありませんが、可変タイプには微妙な小さな落とし穴があります.
可変タイプおよび小さなトラップ:
def append_item(item, list1=[]):
    list1.append(item)
    return list1

print(append_item((1)))  # [1]
print(append_item((2)))  # [1, 2]
print(append_item((6)))  # [1, 2, 6]
list2 = [6, 7]
print(append_item(1, list2))  # [6, 7, 1]
print(append_item(9, list2))  # [6, 7, 1,9]

PS:問題があっても誰も答えてくれないの?Pythonの学習資料が必要ですか?下のリンクをクリックして自分でnoteを取得することができます.youdao.com/noteshare?id=2dce86d0c2588ae7c0a88bee34324d76
質問:なぜ[1,2],[1,2,6]が出力されるのか、デフォルトパラメータが明らかに使用されている場合、append_が呼び出されるたびにitemは、list 1に基づいて要素を追加します.しかし、デフォルト値を使用しないと、このような状況はありません.これはなぜですか.
理由:上記の関数を作成する場合、list 1パラメータは新しいリストを参照するように設定され、その後、最初のパラメータのみを使用して関数を呼び出す(すなわち、2番目のデフォルトパラメータを使用する)場合、デフォルトのリストは関数自体が作成するときに指定されたリストになります.これにより、新しいリストは作成されません.
最初のパラメータのみを使用して関数を呼び出すたびに、新しい空のリストが作成され、次に変更されることを期待します.
def append_item(item, list1=[]):
    if not list1:
        list1 = []
    list1.append(item)
    return list1

print(append_item((1)))  # [1]
print(append_item((2)))  # [2]
print(append_item((6)))  # [6]
list2 = [6, 7]
print(append_item(1, list2))  # [6, 7, 1]
print(append_item(9, list2))  # [6, 7, 1,9]