Python 入門 ノート (40)デフォルト引数で気を付けること

デフォルト引数で気を付けること

リスト(l) に x を追加する関数 test_funcがあります。

def test_func(x, l=[]):
    l.append(x)
    return(l)
y = [1, 2, 3]
r = test_func(100, y)
print(r)

[1, 2, 3, 100]

続けて同じように y を定義して

y = [1, 2, 3]
r = test_func(200, y)
print(r)

とすると、問題なく以下の結果が返ります。

[1, 2, 3, 100]
[1, 2, 3, 200]

関数のデフォルト引数にリストや辞書を用いる場合の注意点!

デフォルト引数に空のリストや辞書などを使いたい場合がよくあります。

その際注意すべき点に以下の様なことがあります。

def test_func(x, l=[]):
    l.append(x)
    return(l)
r = test_func(100)
print(r)

[100]

続けて

r = test_func(100)
print(r)

とすると

[100]
[100, 100]

100 が2個という結果になります。

原因はリスト l が一度しか(最初しか)空になっていないからです。

pythonでは、関数定義の際 リスト(l = [])は*参照渡しされていますので、 このようになります。

バグに繋がりやすいので注意が必要です。

これを避けるには、毎回毎回、空ののリストや辞書を使いたい場合は

l に None を代入します。

そして、もし l が空の場合のみ、空のリスト l が返るようにします。

def test_func(x, l=None):
    if l is None:
        l = []
    l.append(x)
    return(l)
r = test_func(100)
print(r)

r = test_func(100)
print(r)

[100]
[100]

 

 

 

コメント