LoginSignup
2
3

More than 5 years have passed since last update.

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

Posted at

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']
2
3
0

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
2
3