web-dev-qa-db-ja.com

Pythonで空の辞書が危険なデフォルト値であるのはなぜですか?

Python関数のオプション引数のデフォルト値として空の中括弧を入れたところ、pylint(Sublimeパッケージを使用)は危険だと言っていました。代わりにNoneを使用するより良い代替手段はありますか?

68
tscizzle

関数が引数を変更する場合にのみ危険です。デフォルトの引数を変更すると、次の呼び出しまで保持されるため、「空の」辞書には最初の呼び出し以外の呼び出しの値が含まれるようになります。

はい、そのような場合にNoneを使用することは安全であり、従来どおりです。

81
John Zwinck

例を見てみましょう:

def f(value, key, hash={}):
    hash[value] = key
    return hash

print f('a', 1)
print f('b', 2)

あなたはおそらく出力することを期待しています:

{'a': 1}
{'b': 2}

しかし、実際に出力するもの:

{'a': 1}
{'a': 1, 'b': 2}
99
Bill Lynch