📜  门| GATE-CS-2016(Set 2)|问题7(1)

📅  最后修改于: 2023-12-03 15:28:44.862000             🧑  作者: Mango

程序员必知的GATE-CS-2016(Set 2)问题7

这是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在调用之间保持默认参数值列表不变,因此第三个调用的输出与第一个调用相同。

总结:当函数参数包含默认参数时,要多加小心,以避免出现在调用之间传递默认参数值的情况。