Python 函数意外地记住了列表的长度并将其添加到每次迭代中



我正在尝试检查Collatz序列的"停止时间"数量。该脚本将每个函数"步骤"的结果附加到列表中,我使用该长度来计算"步骤"的总数。脚本还可以,但是!每当我多次使用时,它都会返回错误长度的列表。我不知道 wht,但它保留列表的先前长度并将其添加到下一个函数结果中。

def stopping_time(n, l=[]):
if n == 1:
return
elif n % 2 == 0:
n = n // 2
l.append(n)
stopping_time(n)
else:
n = n * 3 + 1
l.append(n)
stopping_time(n)
return len(l)

a = stopping_time(4)
b = stopping_time(13)
c = stopping_time(19)
d = stopping_time(27)
print(a, b, c, d)
# 'a' shoulb be 2, 'b' should be 9, 'c' should be 20 and 'd' should be 111
# instead its 2, 11,  31,  142

有什么想法吗?

这不是一个错误,而是一个功能。Python 确实会记住在调用之间作为默认参数传递的可变值(参见 https://docs.quantifiedcode.com/python-anti-patterns/correctness/mutable_default_value_as_argument.html(。

解决方案可能是将哨兵值作为参数传递,如下所示:

def foo(bar=None):
if bar is None:
bar=[]
...

通常,默认情况下将 list 参数设置为 None,如果调用方未传递其他值,则在函数内将其设置为 []。

最新更新