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(
)会改变输出值?我编写第二个函数只是为了与第一个函数进行比较。抱歉,这会造成混乱。
答案 0 :(得分:6)
这是两种不同事物之间的相互作用:
1)Python中的函数参数默认值不会在每次调用时重新计算,而是在函数定义时重新计算(在"Least Astonishment" and the Mutable Default Argument进行更大讨论)
2)Python需要在调用函数之前对函数的所有参数求值(例如,要执行print(1+2, 5*3)
,1+2
和5*3
,必须先计算{{1 }}甚至被考虑)
因此,如果您多次调用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
。