📅  最后修改于: 2023-12-03 15:28:44.862000             🧑  作者: Mango
这是GATE-CS-2016(Set 2)的第7道问题,该考题主要考察了程序员对Python的理解和应用能力。让我们来看看考题:
Q7. What is the output of the following code?
def f(x, lst=[]):
for i in range(x):
lst.append(i*i)
print(lst)
f(2)
f(3,[3,2,1])
f(3)
a) [0, 1, 4] [0, 1, 4, 9] [0, 1, 4, 0, 1, 4, 9]
b) [0, 1, 4] [3, 2, 1, 0, 1, 4, 9] [0, 1, 4, 0, 1, 4, 9]
c) [0, 1, 4] [0, 1, 4, 9] [0, 1, 4, 9]
d) [0, 1, 4] [3, 2, 1, 0, 1, 4, 9] [0, 1, 4, 9]
这道问题比较简单,但是需要注意到一个Python中比较容易出错的坑——默认参数。当函数定义中的参数包含默认参数时,Python会在收到调用时为其初始化,初始化后默认参数的值会在调用之间传递。这就是为什么前两个函数的输出结果不同的原因。现在,让我们看看答案是什么。
答案是b) [0, 1, 4] [3, 2, 1, 0, 1, 4, 9] [0, 1, 4, 9]。第一个函数f(2)会输出[0, 1, 4],因为lst默认值被设置为[]并且它在f(2)调用中为lst创建了一个空列表。第二次调用f时,lst的值被设置为给定的[3,2,1]列表,因此输出[3, 2, 1, 0, 1, 4, 9]。第三个调用与第一个调用类似,因为lst被重复使用。由于Python在调用之间保持默认参数值列表不变,因此第三个调用的输出与第一个调用相同。
总结:当函数参数包含默认参数时,要多加小心,以避免出现在调用之间传递默认参数值的情况。