此问题在此处已有答案:
How can I avoid issues caused by Python's early-bound default parameters (e.g. mutable default arguments "remembering" old data)?(10个答案)
22小时前关门了。
我试图将一个数字分解为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]
但它只在我第一次调用函数时起作用,然后在第一次调用后,我以前的结果显示为参数:
为什么会发生这种情况,我该如何解决?
1条答案
按热度按时间jyztefdp1#
将
lst
参数的默认值更改为None
,如果它是None,则在函数中示例化它。阅读Python Gotchas关于为什么使用可变的默认参数值是不好的。