在阅读this thread之后,我还尝试着使用默认参数来弄脏我的手。因此,以下是具有可变默认参数的相同函数:-
def foo(x = []):
x.append(1)
return x
与defined in the docs一样,定义函数时仅对默认值进行一次评估。
因此,执行此语句print(foo(), foo(), foo())
后,我希望输出如下所示:[1] [1, 1] [1, 1, 1]
相反,这是我实际上得到的输出:-
>>> print(foo(), foo(), foo())
[1, 1, 1] [1, 1, 1] [1, 1, 1]
执行语句的方式(根据我的情况)是:第一个函数调用返回[1],第二个函数调用返回[1,1],第三个函数调用返回[1,1 ,1],但这只是重复打印的第3个函数调用返回值。
此外,将相同的函数返回值打印为单独的语句(如该线程中所述)可以得到预期的结果,即
>>> print(foo())
[1]
>>> print(foo())
[1, 1]
>>> print(foo())
[1, 1, 1]
那么,为什么同时打印相同的函数返回值却不像单独执行时那样返回输出呢?
答案 0 :(得分:1)
在第二个示例中没有尝试的是保存返回引用,如下所示:
a = foo()
print(a)
b = foo()
print(b)
c = foo()
print(c)
print(a, b, c)
输出:
[1]
[1, 1]
[1, 1, 1]
[1, 1, 1] [1, 1, 1] [1, 1, 1]
现在您应该可以看到a, b, c
实际上是指同一列表,在不同时间具有不同的内容。
答案 1 :(得分:0)
自变量L仅在arg行中被求值一次,但是到执行打印功能时,列表已被突变为[1、1、1、1]。防止这种情况的最简单解决方案是每次复制/复制列表内容。
print(foo()[:], foo()[:], foo())