Python面试难题解析:默认参数与闭包
32 浏览量
更新于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代码和成功通过面试至关重要。在实际开发中,正确使用默认参数和理解闭包的工作原理可以避免很多潜在的问题。
2023-04-07 上传
2022-05-22 上传
2021-08-24 上传
2024-03-26 上传
2021-08-13 上传
2021-01-19 上传
点击了解资源详情
2024-03-01 上传
2022-11-17 上传
weixin_38660108
- 粉丝: 6
- 资源: 924
最新资源
- Angular实现MarcHayek简历展示应用教程
- Crossbow Spot最新更新 - 获取Chrome扩展新闻
- 量子管道网络优化与Python实现
- Debian系统中APT缓存维护工具的使用方法与实践
- Python模块AccessControl的Windows64位安装文件介绍
- 掌握最新*** Fisher资讯,使用Google Chrome扩展
- Ember应用程序开发流程与环境配置指南
- EZPCOpenSDK_v5.1.2_build***版本更新详情
- Postcode-Finder:利用JavaScript和Google Geocode API实现
- AWS商业交易监控器:航线行为分析与营销策略制定
- AccessControl-4.0b6压缩包详细使用教程
- Python编程实践与技巧汇总
- 使用Sikuli和Python打造颜色求解器项目
- .Net基础视频教程:掌握GDI绘图技术
- 深入理解数据结构与JavaScript实践项目
- 双子座在线裁判系统:提高编程竞赛效率