
Python面试重点不在背题,而在理解底层逻辑和实际应用边界。高频问题看似零散,实则围绕语言特性、内存行为、并发模型、函数式工具和对象模型这五个核心展开。
可变与不可变:不只是能不能改
列表能增删改,元组不能——这是表层认知。真正关键的是它们在函数传参、字典键、内存共享上的连锁反应:
- 元组可作为字典的键,列表不行,因为哈希值必须稳定
- 函数默认参数若用列表,多次调用会累积修改(因是同一对象);用元组或None+内部新建则安全
- 赋值语句如 a = b 是引用传递,对列表操作会影响原对象;但对元组重新赋值(a = (4,5))只是换了个引用,不改变原元组
深拷贝 vs 浅拷贝:嵌套结构才是分水岭
浅拷贝只复制顶层,内部嵌套对象仍共用;深拷贝递归复制所有层级。判断是否需要深拷贝,看数据结构里有没有嵌套的可变对象:
- 浅拷贝适用场景:纯数字列表、字符串元组、嵌套中全是不可变对象
- 深拷贝必要场景:含嵌套列表、字典、自定义类实例等,比如配置字典带子项、树形结构数据
- 注意:深拷贝性能开销大,循环引用时需靠copy模块自动处理,无需手动干预
is 和 ==:身份与值的严格区分
== 比较值,受 __eq__ 方法控制;is 比较内存地址,无法重写。常见误判点:
立即学习“Python免费学习笔记(深入)”;
- 小整数(-5 到 256)和短字符串常驻内存,a is b 可能为 True,但这是实现细节,不能依赖
- if x == None 应写成 if x is None,避免类重载了 __eq__ 导致意外结果
- 函数返回空列表 [] 或空字典 {},用 if not data: 判断真假性更安全,而非 is
filter / map / lambda:别只记得语法
Python 3 中 filter 和 map 都返回迭代器,不立即计算。这意味着:
- 多次遍历会失效,需转 list 或重新调用
- 配合 lambda 使用时,优先考虑可读性:简单条件用 lambda,复杂逻辑直接写函数
- filter(None, seq) 是惯用法,过滤掉所有 falsy 值(''、0、None、[] 等),比写 lambda 更简洁
GIL 与多线程:不是“不能用”,而是“用在哪”
GIL 不是缺陷,是 CPython 的设计权衡。它限制的是 CPU 密集型任务的并行,但对 I/O 操作天然友好:
- 文件读写、网络请求、数据库查询期间,GIL 会释放,此时多线程可并发执行
- CPU 密集任务(如数值计算、图像处理)应选 multiprocessing 或使用 numba/cython 加速
- asyncio 在单线程内协程调度,适合高并发 I/O 场景,比 threading 更轻量










