SSブログ

Python のデフォルト引数に辞書を使う件 [Python]

http://d.hatena.ne.jp/kwatch/20080415/1208274736
def f(d={}) という定義があった場合、Ruby では「{}」が関数呼び出しごとに評価されるので、関数呼び出しごとに新しい Hash オブジェクトが生成される。 これに対し、Python では「{}」が定義時にしか評価されないので、dict オブジェクトは定義時に 1 回だけ生成され、それが毎回引数として渡される。

これについては個人的には関数のキャッシュの置き場所としてわりと重宝してるのでこのままでいいかなあと思う。
こんな風なコードの書き換えを良くする。
def fib1(n):
  if n <= 2:
    return 1
  else:
    return fib1(n-2)+fib1(n-1)

def fib2(n, cache={}):
  if cache.has_key(n):
    return cache[n]
  if n <= 2:
    return 1
  else:
    cache[n] = fib2(n-2)+fib2(n-1)
    return cache[n]

スコープ的にグローバルというわけではなく、それでいて関数呼び出しをまたいで寿命があるオブジェクトが作れるので割りとうまい具合に収まります。まあなんか泥臭い気がするよ?といわれればそうかもしれないのですが。
Python で関数の戻り値をキャッシュするときの手軽なイディオムが他にあれば知りたいところです。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。