2009年7月12日日曜日

Pythonのメソッドのパラメータの不思議

Windows上のPython2.5のPytyon Shellで確認した。

こんなclassがあったとする。

class Test(object):
 def foo(self):
  return [self.bar(), self.bar({'buz': 10})]
 def bar(self, p={'buz': 1}):
  p['buz'] += 1
  return p

下記のように、dict型の引数pに初期値が設定されているメソッドbar()を引数無しで呼ぶと、前回呼んだ時のメソッド内の変数pの値が使われるようだ。
>>> Test().foo()
[{'buz': 2}, {'buz': 11}]
>>> Test().foo()
[{'buz': 3}, {'buz': 11}]

ちょっとびっくり。引数の型がdictの場合だけでなく、配列でも同じことが起きた。


また、classじゃなくても同じ現象になった。
def test(foo={'bar': 1}):
 foo['bar'] += 1
 return foo

>>> test()
{'bar': 2}
>>> test()
{'bar': 3}
>>> test({'bar': 10})
{'bar': 11}
>>> test()
{'bar': 4}
引数を付けた時だけ別になっている。

0 件のコメント:

ブログ アーカイブ

tags