私はPythonを学び、MutableDefaultArgumentの問題を扱っています。
# BAD: if `a_list` is not passed in, the default will wrongly retain its contents between successive function calls
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
# GOOD: if `a_list` is not passed in, the default will always correctly be []
def good_append(new_item, a_list=None):
if a_list is None:
a_list = []
a_list.append(new_item)
return a_list
a_list
これは、ステートメントが最初に検出されたときにのみ初期化されることを理解しています。そのdef
ため、以降の呼び出しでbad_append
同じリストオブジェクトが使用されます。
私が理解していないのは、なぜgood_append
動作が異なるのかということです。まだ一度だけ初期化されるa_list
ようです。したがって、このステートメントは関数の最初の呼び出しでのみtrueになります。つまり、最初の呼び出しでのみリセットされます。つまり、過去のすべての値が累積され、バグが発生します。if
a_list
[]
new_item
なんでじゃないの?どのような概念が欠けていますか?a_list
実行するたびにどのようにきれいに拭き取られgood_append
ますか?