Python高频面试题分类汇总_系统整理

3次阅读

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

Python 高频面试题分类汇总_系统整理

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

text=ZqhQzanResources