Pythonのデフォルト引数の話

2021.03.30

2021.08.12

Fabeee社員ブログ

はじめまして、2月に入社しましたクマです。
寒暖差が激しい毎日ですが皆様いかがお過ごしでしょうか。
暖かくなったら公園の日当たりの良い場所でお仕事したいです。
初めてのブログ、何書こうかな〜と散々悩みました。
最近Javaを触ることもあるけどせっかくだからPythonに関することを書きたい!
ということで、今回はPythonのデフォルト引数についてお話しようと思います。
 
 

デフォルト引数って?

デフォルト引数は、仮引数に対して初期値を設定することができる機能です。
以下のようなコードを見かけたことはありませんか?

def hoge(arg1, arg2='arg2', arg3=None):
    print(arg1)
    print(arg2)
    print(arg3)

 
このように仮引数名=デフォルト値とすると初期値がセットできるわけです。
こうすると、関数を呼び出す時に引数を省略することができます。
実際に使ってみるとこんな感じ。

def hoge(arg1, arg2='arg2', arg3=None):
    print(arg1)
    print(arg2)
    print(arg3)
hoge('こんにちは')
# こんにちは
# arg2
# None

関数宣言時に設定しているのはあくまでの初期値のため、関数を呼び出す時に引数を書いてあげるとそちらが反映されます。
逆に、デフォルト値が設定されていないのに引数を省略するとTypeErrorが発生します。

def hoge(arg1, arg2='arg2', arg3=None):
    print(arg1)
    print(arg2)
    print(arg3)
hoge('こんにちは', '私は')
# こんにちは
# 私は
# None
hoge('こんにちは', '私は', 'クマです')
# こんにちは
# 私は
# クマです
hoge()
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: hoge() takes at least 1 argument (0 given)

デフォルト引数に変数をセットしてみる

次はデフォルト引数に変数をセットしてみましょう。

def hoge(arg1=val, arg2='arg2', arg3=None):
    print(arg1)
    print(arg2)
    print(arg3)

このまま関数呼び出しをするとname ‘val’ is not definedが出てしまうので、変数を宣言してから実行します。

val = 'おはようございます'
def hoge(arg1=val, arg2='arg2', arg3=None):
    print(arg1)
    print(arg2)
    print(arg3)
hoge()
# おはようございます
# arg2
# None

変数を設定した場合もきちんと出力されました!
では関数呼び出しの前に変数の値を上書きするとどうなるのでしょう。

val = 'おはようございます'
def hoge(arg1=val, arg2='arg2', arg3=None):
    print(arg1)
    print(arg2)
    print(arg3)
val='こんにちは'
hoge()
# おはようございます
# arg2
# None

なんと、出力される値はおはようございますのままでした…。
というのも実はPythonチュートリアルに説明が書かれています。
関数が定義される時点で関数と同一スコープで変数が宣言されている必要があり、
また、引数のデフォルト値は一度しか評価されないため、関数定義後に変数を上書きしてもデフォルト引数の値は変わらなかったんですね。
つまりこういうのもダメなわけです。

def hoge(arg1=val, arg2='arg2', arg3=None):
    print(arg1)
    print(arg2)
    print(arg3)
val = 'おはようございます'
hoge()
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# def hoge(arg=val, arg2='arg2', arg3=None):
# NameError: name 'val' is not defined
さらに、listやdictを使用する時には関数内で行った変更がそのままになるため、注意しなければなりません。
def hoge(args=[]):
    args.append('こんにちは')
    for arg in args:
        print(arg)
hoge()
# こんにちは
hoge()
# こんにちは
# こんにちは

最後に

いかがでしたでしょうか。
基礎的な部分ではありますが、デフォルト引数は目にすることも多いと思うので少しでもお役に立てれば幸いです。
以上、クマでした!皆さんよいPythonライフを〜!
 
 

Fabeee編集部

Fabeee編集部

こちらの記事はFabeee編集部が執筆しております。