Python と Ruby、デフォルト引数の評価の違い

Python と Ruby、デフォルト引数の評価の違い

2007/01/05 3:52am

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 における、関数のデフォルト引数は:

というわけだ。

早速、チュートリアルにあるサンプルを 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 とは異なり、関数を実行するたびに評価される。