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的作用。
典型例题:
立即学习“Python免费学习笔记(深入)”;
- 写出一个计数装饰器,要求每次调用被装饰函数时打印累计调用次数
- 以下代码输出什么?
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







