【发布时间】:2021-12-20 05:52:04
【问题描述】:
所以 a 有两个函数进行递归调用,第一个调用修改列表 l1,然后将其传递给第二个调用。在 f1 第二次递归调用中收到修改后的列表 [1,1]:
b 2 []
b 1 []
a 1 [1, 1]
b 1 [1, 1]
a 1 [1, 1, 1, 1]
a 2 [1, 1, 1, 1, 1, 1]
但在 f2 第二次调用中收到未修改的空列表:
b 2 []
b 1 []
a 1 [1, 1]
b 1 []
a 1 [1, 1]
a 2 [1, 1, 1, 1]
为什么? f2(f1) 不是在这两种情况下都被连续调用了吗?
def f1(l1=[],num = 2):
if num == 0: return[1]
print('b',num,l1)
l1 = [*l1, *f1(l1, num-1)]
l1 = [*l1, *f1(l1, num -1)]
print('a',num,l1)
return l1
def f2(l1=[],num = 2):
if num == 0: return[1]
print('b',num,l1)
l1 = [*l1, *f2(l1, num-1),*f2(l1, num -1)]
print('a',num,l1)
return l1
如果列表理解是一个问题(你不能在其中修改列表),为什么在这里修改它:
def f3(l1):
print(l1)
l1 +=[1]
return l1
l1 = []
l1 = [*l1, *f3(l1), *f3(l1)]
print(l1)
[]
[1]
[1, 1, 1]
【问题讨论】:
-
不确定您要达到的目标。函数 f1 和 f2 在功能上是不同的。因此,使用相同的输入值连续调用 f1 和 f2 可能会产生不同的结果
-
我只是想了解它为什么会这样工作。在 f3 示例中,一个修改后的列表在列表理解中是过去的,尽管它看起来很像 f2。
-
这里不相关(您似乎不会在没有第一个参数的情况下调用任何一个函数),但不要使用列表作为默认参数值。见stackoverflow.com/questions/1132941/…。