Pythonのディフォルト引数のアイデンティティと忍者と中世


class ItemList(object):
""" リストを管理持つクラス """
def __init__(self, items=[]):
self.items=items
さてこの実装何がいけないでしょうか?

a=ItemList()
b=ItemList()
a.items.append('hi')
print a.items
# ['hi']
print b.items
# ['hi']
# あれ?
print a.items==b.items
# True
# あらま

pythonでは関数のデフォルト引数は毎回同じインスタンスなのです。ItemList()が呼ばれる度にitems=[]が評価されて新しい空リストが与えられそうな気がするんだけどそうじゃない。


class ItemListCorrect(object):
def __init__(self, items=None):
self.items=items or []
def __repr__(self): return str(self.items)
こうすると、毎回別の空リストインスタンスが生成される。

a=ItemListCorrect()
b=ItemListCorrect()
a.items.append('hi')
print a
# ['hi']
print b
# []
print a.items==b.items
# False

リンク

これについてはNorvig先生から学んだが今でもタマにやってしまう

"(go|get) ~ on ~"の意味

しかし、原文を読むと翻訳ではわからない微妙なニュアンスが伝わって面白い。例えば「Q: How do I do the Singleton Pattern in Python?」に
Before the Gang of Four got all academic on us, ``singleton'' (without the formal name) was just a simple idea that deserved a simple line of code, not a whole religion.
とある

Gang of Four」は「デザインパターン」をソフト業界に流行させたこの本の著者4名のこと http://www.amazon.com/Design-Patterns-Elements-Object-Oriented-ebook/dp/B000SEIBB8

意訳としてはこんな感じだろう: 「シングルトン」っていうのは一行のコードにしか値しない簡単なアイデアだったのがデザインパターンが流行って一つの宗教になってしまった。

では"got all academic on us"はどういう意味だろうか。この俗語を訳すのは難しいので例で説明する。

  • I am going to go ninja on you

これは「忍者のようにお前をつけまわすしてやるぞ」という脅しである。

  • They got medieval on me

この実例は更に説明を要する。中世は暗く陰険な時代で、薄暗い白の地下室で拷問とかが頻繁に行われていた。なので"go medieval on 誰それ"というのは「中世の審問官のように拷問してやるぞ」という意味である。

中世の拷問ぐらい辛い「パターン」

なので、"got all academic on us"というのは忍者が敵を執拗につけまわしたり中世の審問官が魔女と疑われた者を拷問するように、「苦痛のなるぐらい過剰なアカデミックな解釈を我々に押し付けた」という意味になる。Norvig先生自身アカデミアの出身だが、そういう彼でも「ソフトウエアパターン」にはウンザリするぐらい説教臭く感じていたという心境が伺える。

Norvig先生も教科書を参考にする

PriorityQueueクラスのheapify()のコメントに「CLR&S p. 130」参照とある。Norvig先生ならheapのアルゴリズムぐらい頭から指先に流れてコードになると思いきや、本を見ているようだ。彼が参考にするアルゴリズムの本は何か? アルゴリズムのバイブル「モビールの本」だ: http://www.amazon.co.jp/Introduction-Algorithms-Third-Thomas-Cormen/dp/0262533057 (バイブルといったらKnuthか。大辞典ぐらいにしておこう。) というわけで大先生もアルゴリズムは教科書から打込むということがわかった。

たかがプログラミング言語のハウツーものをここまで深読みするのは暇人のすることだ。しかしNorvigが書いたものだとそいういう価値がある。言葉の重みが違うから。