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

2024-05-03 10:52:36 发布

您现在位置: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(会改变输出值?我编写第二个函数只是为了与第一个函数进行比较。抱歉,如果这造成了混乱。你知道吗


Tags: 函数returndef方式print调用函数arrappend
1条回答
网友
1楼 · 发布于 2024-05-03 10:52:36

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

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

2)Python在调用函数之前需要计算函数的所有参数(例如,要执行print(1+2, 5*3),甚至在考虑print之前都需要计算1+25*3

因此,如果多次调用f,而不使用第二个参数,那么它只会附加到最初在def中声明的相同数组。这是您在第二个示例中可以清楚地看到的。第一个调用在第一个突变([1])后打印arr;第二个调用在第二个突变([1, 2])后打印arr。你知道吗

第一个例子是不同的,因为我说的第二个原则:在调用函数之前计算所有参数。因此print(f(1), f(2))将首先调用f(1),将arr更改为[1];然后f(2)将被求值,将arr更改为[1, 2]。由于两个函数调用都返回了对arr的引用,因此print将打印arr的内容两次:[1, 2], [1, 2]。你知道吗

相关问题 更多 >