オプション引数とその注意点

入門Python3 4.7.3

def foo(a,b=10):
    print(a,b)

foo(1,2)
foo(1)   # 引数の省略
$ py main.py
1 2
1 10

この用に引数を省略することができます。C#等にもありますね。

ただし一つ注意点があります。

Pythonのオプション引数は関数の実行時ではなく定義時に定義されるので例えば以下のような処理を書くと痛い目にあいます。

def foo(ary = []):
    ary.append(1)
    return ary

print(foo())
print(foo())
print(foo())
$ py main.py
[1]
[1, 1]
[1, 1, 1]

このようにfooを呼び出すたびに増えていきます。この挙動はちょっと直感に反してる気もしますね・・・。

これを実行時に初期化するには例えば以下のようにする必要があります。

def foo(ary = None):
    if ary is None: ary = [] # 毎回ここで初期化する
    ary.append(1)
    return ary

print(foo())
print(foo())
print(foo())
$ py main.py
[1]
[1]
[1]

これで想定通りに動きましたね。