python 面试核心考察变量赋值(引用传递)、可变 / 不可变对象区别(list/dict/set 可变,tuple/str/int 不可变)、字符串拼接效率(join 优于 +)、dict.keys()返回视图对象、is 与 == 语义差异、legb 作用域与闭包机制(需 nonlocal)、__new__与__init__分工、特殊方法实现鸭子类型、并发模型选择依据及常用模块特性。

Python 基础语法与数据类型
面试常考变量赋值、可变与不可变对象的区别,尤其关注 list、dict、set、tuple 的底层行为。比如:a = [1, 2]; b = a; b.append(3)后 a 和 b 是否相等?答案是相等——因为 list 是可变对象,赋值只是引用传递。
常见陷阱题:
- 字符串拼接用 + 还是 join?——大量短字符串用
''.join(list)更高效,+ 在循环中会频繁创建新对象 - dict.keys()返回的是列表吗?——Python 3 中返回
dict_keys视图对象,支持迭代和 in 判断,但不支持索引 - is 和 == 的区别 ——
is比内存地址(同一对象),==调用__eq__方法比值;小整数 [-5, 256] 和短字符串会缓存,所以100 is 100为 True,但[1] is [1]为 False
函数与作用域(LEGB 与闭包)
面试高频问lambda、装饰器、闭包形成条件。关键点在于理解嵌套函数如何捕获外部变量,以及 nonlocal 的作用。
典型例题:
- 写出一个计数装饰器,要求每次调用被装饰函数时打印累计调用次数
- 以下代码输出什么?
def make_multiplier(n): return lambda x: x * n f = make_multiplier(3) print(f(4)) # 输出 12 —— 闭包保存了 n =3 - 为什么 for 循环中用 lambda 常出错?——所有 lambda 共享同一个 i 变量,需用默认参数固化:`lambda x, i=i: x*i`
面向对象与特殊方法
重点考察__init__ vs __new__、__str__ vs __repr__、@property、类方法 / 静态方法区别,以及多继承 MRO(C3 算法)。
实用建议:
-
__new__控制对象创建(如单例模式),__init__负责初始化;__new__必须返回实例,否则__init__不执行 -
__repr__应尽量返回可复现对象的字符串(如Point(1, 2)),__str__面向用户,可读优先 - 自定义类想支持
len(obj)就实现__len__,支持obj[key]就实现__getitem__,这是 Python“鸭子类型”的体现
并发、异常与常用模块
区分 threading、multiprocessing、asyncio 适用场景:CPU 密集用多进程,IO 密集用多线程或协程;asyncio 需配合 await/async 和事件循环。
高频细节:
-
try……except……else……finally中,else只在无异常时执行,finally一定执行(哪怕有 return 或 raise) -
os.path.join()比字符串拼接更安全,自动处理路径分隔符;pathlib.Path是现代推荐方式,链式调用更直观 -
collections.defaultdict避免键不存在报错,Counter快速统计频次,deque高效首尾操作——这些比手写逻辑更 Pythonic






























