Python面试难题解析:默认参数与闭包
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代码和成功通过面试至关重要。在实际开发中,正确使用默认参数和理解闭包的工作原理可以避免很多潜在的问题。
2022-05-22 上传
2023-04-07 上传
2021-08-24 上传
2024-03-26 上传
2021-08-13 上传
2021-01-19 上传
点击了解资源详情
2024-03-01 上传
2023-03-09 上传
weixin_38660108
- 粉丝: 6
- 资源: 924
最新资源
- Fisher Iris Setosa数据的主成分分析及可视化- Matlab实现
- 深入理解JavaScript类与面向对象编程
- Argspect-0.0.1版本Python包发布与使用说明
- OpenNetAdmin v09.07.15 PHP项目源码下载
- 掌握Node.js: 构建高性能Web服务器与应用程序
- Matlab矢量绘图工具:polarG函数使用详解
- 实现Vue.js中PDF文件的签名显示功能
- 开源项目PSPSolver:资源约束调度问题求解器库
- 探索vwru系统:大众的虚拟现实招聘平台
- 深入理解cJSON:案例与源文件解析
- 多边形扩展算法在MATLAB中的应用与实现
- 用React类组件创建迷你待办事项列表指南
- Python库setuptools-58.5.3助力高效开发
- fmfiles工具:在MATLAB中查找丢失文件并列出错误
- 老枪二级域名系统PHP源码简易版发布
- 探索DOSGUI开源库:C/C++图形界面开发新篇章