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

问题描述 投票:3回答:1
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(以不同的方式改变输出值?我编写第二个函数只是为了与第一个函数进行比较。对不起,如果这造成了混乱。

python
1个回答
6
投票

这是两个不同事物之间的互动:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.