0

重複の可能性:
Pythonの「驚き最小の原則」:可変のデフォルト引数

数値を2の累乗に分割しようとしていますが、関数は前の呼び出しの結果を記憶しています。

from math import log

#split number in powers of 2
#n   :  number
#lst :  the current list of numbers
def spn(n, lst=list()):
    if n==1:
        lst.append(n)
        return lst
    else:
        #rdy  :  the ready-to-add number
        rdy=2**((log(n+1,2))-1)
        lst.append(rdy)
        #n-rdy:  the new number to evaluate
        return spn(n-rdy, lst)

例えば:

spn(1)は[1]を返す必要があります

spn(3)は[2.0、1.0]を返す必要があります

spn(7)は[4.0、2.0、1.0]を返す必要があります

ただし、関数を最初に呼び出したときにのみ機能し、最初の呼び出しの後、前の結果が引数として表示されます。

ここに画像の説明を入力してください

どうすれば修正できますか?

4

1 に答える 1

3

lst引数のデフォルト値をに変更しNone、それがNoneの場合は、関数内でインスタンス化します。

可変のデフォルト引数値を使用することがなぜ悪いのかについてのPythonの落とし穴について読んでください。

于 2012-06-05T14:40:59.833 に答える