Python面试深度解析:8大必考问题与陷阱

1 下载量 134 浏览量 更新于2024-09-01 收藏 85KB PDF 举报
"Python面试中8个必考问题,涵盖了函数默认参数行为和闭包相关的知识点,适合准备Python面试者参考学习。" 在Python面试中,有两类问题常常出现,一是关于函数默认参数的理解,二是关于闭包的概念及其应用。让我们逐一深入探讨。 1、函数默认参数的行为 在Python中,函数的默认参数只在函数定义时初始化一次。例如,给定的代码段: ```python def extendList(val, list=[]): list.append(val) return list ``` 在这个例子中,`list=[]` 是一个默认参数。每次调用 `extendList` 函数而未提供 `list` 参数时,它会使用之前已经创建的默认列表。因此,`list1` 和 `list3` 的结果实际上是共享同一个列表对象,导致它们的输出相同。要得到预期的行为,即每个调用都有独立的列表,可以修改函数定义如下: ```python def extendList(val, list=None): if list is None: list = [] list.append(val) return list ``` 这样,如果未指定 `list` 参数,函数内部会创建一个新的空列表,避免了默认参数的共享问题。输出结果将是: ``` list1=[10] list2=[123] list3=['a'] ``` 2、闭包与延迟计算 闭包是指有权访问另一个函数作用域中变量的函数,特别是那些局部变量。在下面的代码中: ```python def multipliers(): return [lambda x: i * x for i in range(4)] print [m(2) for m in multipliers()] ``` 这个例子创建了一个返回四个闭包的列表,每个闭包引用了外部函数作用域的变量 `i`。然而,当 `i` 的值在循环结束后被改变,所有闭包都指向了相同的最终值,也就是3。因此,输出是 `[6, 6, 6, 6]`。要得到预期的[0, 2, 4, 6],我们需要确保每个闭包捕获的是 `i` 的即时值。这可以通过使用匿名函数 `lambda` 内部的 `default arguments` 来实现: ```python def multipliers(): return [lambda x, i=i: i * x for i in range(4)] print [m(2) for m in multipliers()] ``` 现在每个闭包都拥有一个局部变量 `i` 的副本,而不是共享一个全局的 `i`,因此输出将是: ``` [0, 2, 4, 6] ``` 这两个问题揭示了Python中关于默认参数和闭包的微妙之处,对于面试者来说,理解这些概念至关重要,因为它们是Python编程中的核心特性。深入理解这些问题可以帮助你在面试中展现出扎实的Python基础。