0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

引数のデフォルト値はimmutableなものにする(記事解説)

Last updated at Posted at 2020-10-04

こちらの記事を自分にわかるように解説します。
同じ内容を書くことにはなりますがご容赦ください。
https://qiita.com/yuku_t/items/fd517a4c3d13f6f3de40

関数定義やクラスのinitでは引数のデフォルト値を設定できます。
この時、初期値を与えた引数の型がmutable型だった場合よろしくないことが起こります。

初期値あり関数(よくない例).py
def foo(bar=[]): # List型はmutableだよ、気をつけて!
    bar.append('baz')
    print(bar)

これをデフォルト値で実行すると

実行.py
>>> foo()
['baz']
>>> foo()
['baz', 'baz'] # あれ?

結果が変わってしまっている。
何故このようなことになるかというと、Pythonでは関数のデフォルト値は関数定義時にメモリが割り当てられるからである。
上記では、関数定義時に作成されたList型に対して、appendの操作を2度を行ったために、"baz"が2こ入ったのである。

この問題をクリアするには、
つまり、問題なくmutable型の引数に初期値を与えたい時には、関数定義時ではなく、関数呼び出し時にメモリが割り当てられるようにすれば良い。
つまり、関数内部で初期化を行う。

初期値あり関数(よい例).py
def foo(bar=None):
    if bar is None:
        bar = []
    bar.append('baz')
    return bar

immutable型引数に初期値を与えることは、問題ないです。
参考: https://qiita.com/makotoo2/items/fc3a617882916f9775f5

0
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?