当我运行下面的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]我不知道为什么。我怀疑这是作用域的一些问题,但我就是不明白:-(任何帮助都将不胜感激。
发布于 2013-07-10 04:28:49
为函数参数定义的默认值是“粘性的”--它们属于函数体本身,因此当您修改它们时,它们会被修改以备下次调用。
发布于 2013-07-10 04:29:55
这是因为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-10 04:30:20
在函数参数中使用factors=[]作为默认值不是一个好主意。Python在第一次遇到函数定义时只对[]表达式求值一次。基本上,这意味着您对prime_factors的所有调用都将使用相同的列表,并且每个调用都将附加其自己的值。
例如:
prime_factors(9)
prime_factors(9)
prime_factors(9)将会返回
[3,3,3,3,3,3]https://stackoverflow.com/questions/17557570
复制相似问题