4

以下のpythonコードを実行すると、

def main():
    #print prime_factors(10)
    print prime_factors(9)

def prime_factors(n, i=2, factors=[]):
    if n==1:
        return factors
    if(n%i==0):
        factors.append(i)
        n = n/i
        return prime_factors(n, i, factors)
    else:
        return prime_factors(n, i+1, factors)

if __name__ == '__main__':
    main()

期待される結果を返し、9 の素因数を返します。

[3, 3]

2 行目の "print prime_factors(10)" からコメントを削除すると、奇妙なことが起こります。10 の場合はすべて問題ありませんが、9 の場合は 9 の素因数だけでなく、10 の素因数も含まれています。

[2, 5]
[2, 5, 3, 3]

2 つのオプションの引数を指定して関数を呼び出すと、

def main():
    print prime_factors(10, i=2, factors[])
    print prime_factors(9, i=2, factors[])

すべて正常に動作します。

[2,5]
[3,3]

理由がわかりません。これはスコープの問題だと思いますが、理解できません:-(どんな助けもありがたいです。

4

4 に答える 4

7

関数の引数に定義されたデフォルト値は「スティッキー」です。それらは関数本体自体に属しているため、変更すると次の呼び出しまで変更されたままになります。

于 2013-07-09T20:28:49.140 に答える
0

この質問を参照してください:「最小の驚き」と可変デフォルト引数

次のようなことをしたい:

...
def prime_factors(n, i=2, factors=None):
    if factors is None:
        factors = [] 
    ...
于 2013-07-09T20:37:16.137 に答える