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]

如果我用两个可选参数调用函数

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 回答
4

这是因为factors它是一个可变的默认参数。一个被调用的新列表factors只被评估一次,因此如果你改变列表,你会在随后的调用中得到改变的列表。请参阅以下片段 -

>>> def test(a = []):
        a.append('x')
        return a

>>> test()
['x']
>>> test()
['x', 'x']

尝试将其初始化为默认值None,然后None在函数体内检查并分配一个空列表。

>>> def test(a = None):
        if a is None:
            a = []
        a.append('x')
        return a

>>> test()
['x']
>>> test()
['x']
于 2013-07-09T20:29:54.690 回答
0

看到这个问题:“Least Astonishment” and the Mutable Default Argument

你想做这样的事情:

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

将 factor=[] 作为函数参数中的默认值并不是一个好主意。Python 仅在第一次遇到函数定义时对 [] 表达式求值一次。基本上,这意味着您对 prime_factors 的所有调用都将使用相同的列表,并且每个调用都将附加自己的值。

前任:

prime_factors(9)
prime_factors(9)
prime_factors(9)

将返回

[3,3,3,3,3,3]
于 2013-07-09T20:30:20.050 回答