为什么用不同的参数两次打印一个函数会更改输出:python

时间:2018-08-08 11:29:13

标签: python

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 个答案:

答案 0 :(得分:6)

这是两种不同事物之间的相互作用:

1)Python中的函数参数默认值不会在每次调用时重新计算,而是在函数定义时重新计算(在"Least Astonishment" and the Mutable Default Argument进行更大讨论)

2)Python需要在调用函数之前对函数的所有参数求值(例如,要执行print(1+2, 5*3)1+25*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