このエッジケースについては、エキスパートPythonプログラミングで読みました。このコードを確認してください:
def f(arg={}):
arg['3'] = 4
return arg
>>> print f()
{'3': 4}
>>> res = f()
>>> res['4'] = 'Still here'
>>> print f()
{'3': 4, '4': 'Still here'}
f
argに空のdictを割り当てる代わりに(引数なしで呼び出されたため)、前回(戻り値が保存された後)に呼び出されたときに、古い参照が保持される理由はわかりません。
この本は次のように述べています。「引数内にオブジェクトが作成された場合、関数がオブジェクトを返すと、引数参照は引き続き有効です」。
「これがその仕組み」だと理解していますが、なぜそうなのですか?