python 经典面试问题 ### Python面经经典面试问题详解 #### 问题一:函数默认参数的理解 **题目描述**: ```python def extendList(val, list=[]): list.append(val) return list list1 = extendList(10) list2 = extendList(123, []) list3 = extendList('a') print("list1=%s" % list1) print("list2=%s" % list2) print("list3=%s" % list3) ``` **期望输出结果**: ``` list1=[10] list2=[123] list3=['a'] ``` **实际输出结果**: ``` list1=[10, 'a'] list2=[123] list3=[10, 'a'] ``` **解析**: 此题主要考察考生对于Python函数中默认参数的理解。在Python中,默认参数值会在函数定义时被计算并分配内存空间,而不是在每次函数调用时重新计算。这意味着如果默认参数是一个可变对象(如列表),那么每次函数调用时,该参数指向的都是同一块内存地址。 - `list1` 和 `list3` 的情况:由于没有显式地给 `list` 参数赋值,它们都使用了函数定义中的默认参数 `list=[]`。因此,第一次调用 `extendList(10)` 时,`list` 被初始化为 `[10]`,然后 `extendList('a')` 又在这同一个列表上添加了 `'a'`。所以,`list1` 和 `list3` 都指向 `[10, 'a']`。 - `list2` 的情况:由于明确传递了一个空列表 `[]` 作为参数,因此 `list2` 指向的是一个全新的列表,仅包含 `[123]`。 **修正后的代码**: ```python def extendList(val, list=None): if list is None: list = [] list.append(val) return list ``` 通过以上修改,可以确保每次函数调用时都会创建一个新的列表,从而达到期望的效果。 --- #### 问题二:闭包中的延迟绑定 **题目描述**: ```python def multipliers(): return [lambda x: i * x for i in range(4)] print([m(2) for m in multipliers()]) ``` **期望输出结果**: ``` [0, 2, 4, 6] ``` **实际输出结果**: ``` [6, 6, 6, 6] ``` **解析**: 本题考查闭包的概念及其延迟绑定的特性。在Python中,闭包(Closure)指的是函数和它引用的自由变量一起构成的组合体。在这个例子中,每个lambda函数都引用了外部作用域中的变量 `i`。然而,当这些lambda函数被调用时,`i` 的值并不是在函数定义时确定的,而是根据调用时的作用域来查找。 - **问题原因**:在定义闭包时,`i` 的值并未立即绑定到lambda函数中,而是在闭包被调用时才进行绑定。当执行 `multipliers()` 函数时,循环已经结束,`i` 的最终值为 `3`。因此,所有lambda函数中引用的 `i` 都是 `3`,导致所有函数都返回相同的值 `6`(即 `3 * 2`)。 **解决方案**: 1. **使用生成器**: ```python def multipliers(): for i in range(4): yield lambda x: i * x ``` 2. **利用默认函数立即绑定**: ```python def multipliers(): return [lambda x, i=i: i * x for i in range(4)] ``` 3. **使用偏函数**: ```python from functools import partial from operator import mul def multipliers(): return [partial(mul, i) for i in range(4)] ``` --- #### 问题三:类变量与继承 **题目描述**: ```python class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Parent.x, Child1.x, Child2.x) Child1.x = 2 print(Parent.x, Child1.x, Child2.x) Parent.x = 3 print(Parent.x, Child1.x, Child2.x) ``` **期望输出结果**: ``` 1 1 1 1 2 1 3 2 3 ``` **实际输出结果**: ``` 1 1 1 1 2 1 3 2 3 ``` **解析**: 本题考查Python中类变量的访问机制以及继承的特点。 - **初始状态**:`Parent.x`, `Child1.x`, `Child2.x` 均指向 `Parent` 类中的 `x` 属性,其值为 `1`。 - **修改 `Child1.x`**:直接修改 `Child1.x` 的值为 `2`,此时 `Child1.x` 与 `Parent.x` 分离,成为一个独立的变量。 - **修改 `Parent.x`**:修改 `Parent.x` 的值为 `3`,由于 `Child2` 没有定义自己的 `x` 属性,因此仍然引用 `Parent.x` 的值。而 `Child1` 已经有了自己的 `x` 属性,因此不会受到 `Parent.x` 修改的影响。 **结论**: - 类变量是按层次查找的。如果没有在当前类中找到,就会向上级类查找,直至找到为止。 - 如果在子类中定义了同名的类变量,则会覆盖父类的变量。
































剩余9页未读,继续阅读


- 粉丝: 4
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- PLC皮带运输监控系统设计方案.doc
- 网络传播视阈下的地区形象改善策略研究.docx
- 初学者必看!PLC与常见设备连接方式.doc
- plc原理设计的自动售货机.doc
- 汽车零部件行业MRP信息化平台技术.ppt
- 基于PLC实现的彩灯广告牌方案设计书.doc
- 区块链基础:非技术性25步指南
- 北京市通信公司综合业务楼工程大体积砼施工组织设计方案.doc
- 大数据时代互联网广告的营销模式分析.docx
- 浙江省传统村落调研资料数据库的建立与应用研究.docx
- 【精品ppt】互联网+电子商务创新创业融资竞赛-(1).pptx
- 基于PLC交通灯控制系统大学本科方案设计书[1]177.doc
- 通信部队信息化建设存在的问题及解决措施.docx
- 大数据背景下企业人力资源绩效管理创新探讨.docx
- 适用于预测性维护与健康管理的故障诊断及剩余使用寿命预测大型语言模型
- 软件工程期末考试题3.doc


