def f(x, arr=[]):
arr.append(x)
return arr
print(f(1),f(2))
o/p: [1,2] [1,2]
def f(x, arr=[]):
arr.append(x)
return arr
print(f(1))
print(f(2))
o/p: [1]
[1,2]
为什么调用函数f(
以不同的方式改变输出值?我编写第二个函数只是为了与第一个函数进行比较。对不起,如果这造成了混乱。
这是两个不同事物之间的互动:
1)Python中的函数参数默认值不会在每次调用时重新计算,而是在函数定义时重新计算(在"Least Astonishment" and the Mutable Default Argument上进行更大的讨论)
2)Python需要在函数调用函数之前评估函数的所有参数(例如执行print(1+2, 5*3)
,1+2
和5*3
需要在print
被考虑之前计算)
因此,如果你多次调用f
而没有第二个参数,它只会附加到你最初在def
中声明的相同数组。这是您在第二个示例中可以清楚看到的内容。第一次调用在第一次突变后打印arr
([1]
);第二次打印arr
([1, 2]
)。
第一个例子是不同的,因为我说的第二个原则:在调用函数之前评估所有参数。所以print(f(1), f(2))
将首先援引f(1)
,将arr
改为[1]
;然后将评估f(2)
,将arr
改为[1, 2]
。由于两个函数调用都返回了对arr
的引用,因此print
将打印两次arr
的内容:[1, 2], [1, 2]
。