Python面试难题解析:默认参数与闭包

0 下载量 161 浏览量 更新于2024-08-31 收藏 89KB PDF 举报
"Python面试中的8个必考问题涉及到函数默认参数、列表操作、闭包等核心概念。" 在Python编程中,理解函数的默认参数和列表操作是至关重要的,尤其是在面试场景下。首先,让我们深入探讨第一个问题: 1、默认参数的陷阱 题目中的`extendList`函数在定义时使用了默认参数`list=[]`。许多人可能会误以为每次调用函数时,`list`都会被重置为一个新的空列表。然而,实际上,Python在函数定义时就计算了默认参数的值,因此默认的`list`只在函数定义时创建一次。当不传入`list`参数时,后续的调用都会共享这个默认的`list`对象。这就是为什么`list1`和`list3`都对同一个列表进行了修改,导致输出`list1=[10, 'a']`和`list3=[10, 'a']`。为了解决这个问题,我们可以修改函数,使其在没有指定`list`时每次都创建一个新的列表: ```python def extendList(val, list=None): if list is None: list = [] list.append(val) return list ``` 这样,每个调用都会根据需要创建新列表,输出将会是期望的`list1=[10]`,`list2=[123]`,`list3=['a']`。 接下来,我们看第二个问题: 2、闭包与延迟绑定 `multipliers`函数返回了一个包含四个匿名函数(lambda表达式)的列表,每个函数都绑定了外部函数的局部变量`i`。然而,当我们尝试调用这些lambda函数并传入参数时,它们都会查找当前的`i`值,而不是它们被创建时的`i`值。由于所有lambda函数都是在`multipliers`的返回后调用的,此时`i`的值已经变成了4(for循环的最后值),所以它们都会返回`6`。为了解决这个问题,我们可以改变`multipliers`的定义,避免闭包的延迟绑定: ```python def multipliers(): multipliers_list = [] for i in range(4): def inner(x): return i * x multipliers_list.append(inner) return multipliers_list print([m(2) for m in multipliers()]) ``` 在这个修改后的版本中,我们创建了一个内部函数`inner`,它捕获了循环中的`i`的当前值,而不是引用`i`本身。这样,每个内部函数都有自己的`i`副本,输出就会按照预期为`[0, 2, 4, 6]`。 这两个问题展示了Python中的一些常见陷阱,理解和掌握这些知识点对于编写健壮的Python代码和成功通过面试至关重要。在实际开发中,正确使用默认参数和理解闭包的工作原理可以避免很多潜在的问题。