search
LoginSignup
3

More than 5 years have passed since last update.

posted at

Python3系におけるデフォルト引数値指定時に注意

http://www.amazon.co.jp/dp/4873117380 のP115よりメモ

pythonの関数定義の際、引数にデフォルト値を設定することができるが、デフォルト値の値が計算されるのは、関数が実行された時ではなく、定義されたとき

そのため次のように関数定義すると、リストは空ではなく、2回目以降では、前回呼び出した時の値が残る

In [32]: def buggy(arg, result=[]):
   ....:     result.append(arg)
   ....:     print(result)
   ....:

In [33]: buggy('a')
['a']

In [34]: buggy('b')
['a', 'b']

できるだけ、デフォルト値にはイミュータブルなものを指定することがバグを防ぐポイント。

これを回避するには、いろいろあるが、次のように最初の呼出であることを明示的にするなど。

In [35]: def nonbuggy(arg, result=None):
   ....:     if result is None:
   ....:         result = []
   ....:     result.append(arg)
   ....:     print(result)
   ....:
In [36]: nonbuggy('a')
['a']

In [37]: nonbuggy('b')
['b']

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
What you can do with signing up
3