Python と Ruby、デフォルト引数の評価の違い
Python のチュートリアルで勉強している。
その中の 4.7.1 Default Argument Values に、気になる記述があった。
The default values are evaluated at the point of function definition in the defining scope
Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes.
つまり、Python における、関数のデフォルト引数は:
- 関数が定義された時点で
- 最初の1回のみ評価される
というわけだ。
早速、チュートリアルにあるサンプルを python
で実行してみる。
% python
>>> def f(a, l=[]):
... l.append(a)
... return l
...
**>>> print f(1)
[1]
>>> print f(2)
[1, 2]
>>> print f(3)
[1, 2, 3]
**
たしかに、関数 f
のデフォルト引数 l
には定義した時点での []
が、そのまま保持されているようだ。
では、同様のサンプルを今度は Ruby で試してみる。
% irb
irb(main):001:0> def f(a, l=[])
irb(main):002:1> l << a
irb(main):003:1> end
=> nil
**irb(main):004:0> f(1)
=> [1]
irb(main):005:0> f(2)
=> [2]
irb(main):006:0> f(3)
=> [3]
**
実行結果のとおり、Ruby のデフォルト引数は Python とは異なり、関数を実行するたびに評価される。