Engineer as a Lifestyle @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

皆Py書房 -- That's a side of The Python I didn't know(3)

p.96 関数とローカル変数

名前空間が机のメタファで説明されている.

p.126 引数のデフォルト値とリファレンス

>>> def append(L=[]):
	L.append("spam!")
	print L

	
>>> append()
['spam!']
>>> append()
['spam!', 'spam!']
>>> def append(L=[][:]):
	L.append("spam!")
	print L

	
>>> append()
['spam!']
>>> append()
['spam!', 'spam!']
>>> def append(L=list()):
	L.append("spam!")
	print L

	
>>> append()
['spam!']
>>> append()
['spam!', 'spam!']

だめだー回避できない…検索すると,翻訳ドキュメントに発見
http://www.python.jp/doc/release/tut/node6.html#SECTION006710000000000000000

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

なるほど.変更可能なオブジェクトをデフォルト値に用いるときは注意せねば.
ん,みんPyの,引数に対するデフォルト値の代入は一度しか行われません。はおかしいな.公式ドキュメント翻訳で重要な警告: デフォルト値は 1 度だけしか評価されません。とあって,おそらくこちらが正しい.
つまり,def文が実行されたときに1回だけデフォルト値が評価される.変更された可能性のあるデフォルト値だったオブジェクトへのリファレンスはどこかに保持されていて,呼び出し時にそこから毎回代入される,といった感じかなぁ
関数をdir()でみると,関数オブジェクトには,func_defaultsという属性(タプル)があって,ここから呼び出し時に代入されているようだ.