Python 岗的面试,题目围着一小撮东西打转:GIL 到底锁了什么、装饰器怎么写、深拷贝和浅拷贝差在哪、列表和元组怎么选、垃圾回收靠什么。字节、腾讯、华为、美团换了部门、换了面试官,问到的仍是这几块。原因很直接:Python 上手快,面试官想分辨的是你只会写语法,还是清楚解释器在背后做了什么,所以追问总是从"是什么"落到"底层怎么实现"。
这份合集从公开面经里把 Python 方向反复出现的八股题抽出来重新归类,一共 221 道题,分十一个主题。它只收 Python 语言本身和常见框架,操作系统、网络、数据库这类公共基础不在这里展开,后端岗的完整高频清单可以对照后端开发高频面试题榜单,C++ 方向可以看 C++ 面试题合集。
怎么用这份题单:
- 题目后面括号里是近期实际问过这道题的大厂,不代表完整名单,也不代表没标注的公司不问
- Python 八股的追问很有层次:先问"是什么",再问"底层怎么实现",最后问"什么时候会出问题"。只背结论,第二层就会卡住
- GIL 与并发、装饰器与闭包、垃圾回收、可变对象与拷贝这四块是几乎所有 Python 岗的公共必考区,时间不够就先把它们吃透
主题导航:语言特性与解释器 · 数据类型与内置数据结构 · 可变对象、拷贝与参数传递 · 函数、闭包与装饰器 · 迭代器与生成器 · 面向对象 · 内存管理与垃圾回收 · GIL 与并发编程 · 异常、文件与常用库 · Web 框架 · 手撕与代码题
语言特性与解释器
- Python 是什么类型的语言?有哪些特点和优缺点?(华为 / 字节跳动 / 阿里巴巴)
- Python 是解释型语言还是编译型语言?Python 需要编译吗?(字节跳动 / 腾讯)
- Python 代码的执行过程是怎样的?(华为 / 美团)
- Python 是强类型还是弱类型?怎么理解它的动态类型?(字节跳动 / 滴滴)
- Python 是如何实现动态类型的?(字节跳动 / 滴滴)
- Python 和 Java 的主要区别是什么?(字节跳动 / 腾讯 / 美团)
- Python 和 C++ 的区别是什么,各自适合什么场景?(字节跳动 / 百度 / 美团)
- Python、Java、Go 三种语言有什么区别?(腾讯 / 美团 / 字节跳动)
- Python 和 Go 的区别,不要停留在语法层面。(字节跳动 / 腾讯)
- Python 和 JavaScript 有什么区别?(京东 / 腾讯)
- Python 2 和 Python 3 有哪些区别?(美团 / 华为 / 京东)
- Python 为什么执行速度慢?怎么优化 Python 的性能?(华为 / 腾讯)
- Python 有 JIT 吗?理论上能不能做?
- Python 比 Java、Go 快吗?(腾讯)
- CPython 是什么?解释器还有哪些实现?
- 字节码是什么,
.pyc文件是怎么来的? - Python 为什么用缩进表示代码块?缩进用空格还是 Tab?
- Python 的命名空间和作用域是什么?LEGB 规则怎么理解?(华为 / 腾讯)
- Python 的全局变量、局部变量怎么声明?
global和nonlocal有什么用?(华为 / 腾讯) - Python 是否区分大小写?
- Python 的虚拟环境有什么用,为什么要用?(百度 / 腾讯)
- Python 的模块导入机制是怎样的?
__init__.py的作用是什么? - Python 模块重载怎么实现?
==和is有什么区别?(字节跳动 / 阿里巴巴)a, b = b, a在 Python 里是怎么实现交换的?- Python 里哪些值会被判断为
False?(阿里巴巴)
面试官问「Python 的 GIL 是什么?为什么多线程跑不满多核?」,看浮窗当场给你什么
面试官一开口,浮窗就出要点和能直接念的回答,被追问也接得住。共享屏幕时对面看不见。
核心要点 GIL 是 CPython 解释器里的全局锁、同一时刻只有一个线程执行字节码、保护引用计数等解释器内部状态、CPU 密集型用多进程、IO 密集型多线程和协程照样有效
参考回答 GIL 是 CPython 解释器里的一把全局锁,同一时刻只允许一个线程执行 Python 字节码。它的初衷是保护解释器内部状态,尤其是引用计数,不用给每个对象单独加锁。结果就是多线程在 CPU 密集型任务里无法并行利用多核,反而多了线程切换的开销。但遇到 IO 等待(网络、磁盘、sleep)时线程会主动释放 GIL,所以 IO 密集型任务用多线程或协程依然有效。CPU 密集型任务要么用 multiprocessing 多进程,要么把热点交给 C 扩展、NumPy 这类会释放 GIL 的库。
数据类型与内置数据结构
- Python 有哪些基本数据类型?(华为 / 字节跳动 / 小米)
- Python 常用的数据结构有哪些?(蔚来 / 字节跳动 / 百度)
- 列表、元组、字典、集合各自的特点和区别是什么?(腾讯 / 携程 / 字节跳动)
list和tuple的区别是什么,什么时候用元组?(华为)list和set有什么区别?(百度 / 快手)- Python 里哪些数据类型是有序的,哪些是无序的?(美团)
- 字典的底层是怎么实现的?(字节跳动 / 百度)
- 字典的哈希冲突是怎么处理的?
- 字典的 key 有什么要求,为什么列表不能当 key?(快手 / 阿里巴巴)
- 字典的扩容过程是怎样的,时间复杂度是多少?
- 字典删除一个元素,底层发生了什么?
- 字典的查找时间复杂度是多少?
- Python 3.7 之后字典有序是怎么保证的,
OrderedDict还有什么用? list的底层是怎么实现的,是链表还是数组?(滴滴)list的append、insert、pop时间复杂度分别是多少?(腾讯 / 阿里巴巴)- 列表增删元素有哪些方法?(快手 / 网易)
- 怎么在遍历列表的同时删除元素?
- 列表去重有哪些方法?怎么保持原顺序?(美团 / 网易)
- 列表反转有哪几种方法?
- 切片是什么,
[::-1]和负索引是什么意思?切片会产生新对象吗?(华为 / 百度) - 列表推导式是什么,和普通循环相比有什么优势?(携程 / 科大讯飞)
- 字符串有哪些常用处理方法?(快手)
- 字符串反转有哪些写法?(腾讯 / 小米)
- 单引号、双引号、三引号的区别是什么?
str和bytes有什么区别?- 怎么用 Python 实现队列、栈和链表?(华为 / 腾讯)
collections里的deque、defaultdict、Counter分别用在什么场合?set的实际应用场景有哪些?- 元组为什么可以作为字典的 key?元组一定不可变吗?
- 整数在 Python 里占多少字节,有没有大小上限?
/、//、%在 Python 里分别做什么?5/2输出多少?
可变对象、拷贝与参数传递
- 什么是可变对象,什么是不可变对象?各举几个例子。(华为 / 美团 / 商汤)
- 字符串是可变对象还是不可变对象?(华为 / 哔哩哔哩)
- 可变对象的原理是什么,不可变对象为什么线程安全?
- 浅拷贝和深拷贝有什么区别?(华为 / 百度 / 美团)
- Python 怎么拷贝一个对象,
copy模块怎么用?(华为 / 美团 / 字节跳动) - 赋值、浅拷贝、深拷贝三者有什么区别?
- 对列表切片后修改原列表,新变量会受影响吗?(华为 / 腾讯)
- Python 是值传递还是引用传递?(阿里巴巴 / 华为 / 哔哩哔哩)
- 函数传参机制是怎样的,可变对象作参数会发生什么?(华为 / 阿里巴巴)
- 函数的默认参数为什么不能用可变对象?
- 函数参数有哪几种,怎么让参数数量不固定?
*args和**kwargs有什么区别?(华为 / 网易 / 快手)- Python 中的
*和**除了收集参数还有什么用途? - 小整数池和字符串驻留是什么?
id()返回的是什么?
函数、闭包与装饰器
- 装饰器是什么,有什么作用?(华为 / 百度 / 字节跳动)
- 装饰器的原理是什么?(华为 / 字节跳动 / 美团)
- 装饰器的应用场景有哪些,项目里用在哪里?(携程 / 华为 / 蔚来)
- 手写一个最简单的装饰器。(腾讯 / 小米 / 快手)
- 怎么写带参数的装饰器?(华为)
- 多个装饰器叠加时,执行顺序是怎样的?(华为 / 字节跳动)
- 类装饰器怎么写?
functools.wraps的作用是什么,不加会怎样?- 怎么写一个统计函数耗时的装饰器?(腾讯 / 蔚来)
- 怎么写一个异常自动重试的装饰器?(腾讯)
- 装饰器和闭包是什么关系?(京东)
- Python 的闭包是什么,有什么用?(华为 / 字节跳动 / 美团)
- 闭包里修改外层变量需要注意什么?
- lambda 表达式是什么,常用在哪些场景?(华为 / 快手 / 百度)
- lambda 在循环里的延迟绑定问题是什么?
map、filter、reduce分别做什么?- 什么是高阶函数?函数在 Python 里为什么是一等公民?
- 上下文管理器是什么?
with语句的原理是什么,怎么自己实现一个?(华为 / 小米 / 百度) @classmethod、@staticmethod、@property分别是什么?(华为 / 快手)- Python 支持函数重载吗?重载体现在哪里?(华为 / 理想)
- 偏函数
functools.partial有什么用? - 递归的深度限制是多少,怎么修改?
迭代器与生成器
- 迭代器和生成器有什么区别?(中兴 / 科大讯飞 / 京东)
- 可迭代对象和迭代器是什么关系?(百度)
- 怎么自定义一个迭代器?
__iter__和__next__分别做什么? - 生成器是什么,怎么创建?(华为 / 小米 / 百度)
yield的作用是什么?它和return有什么区别?(小鹏 / 百度 / 腾讯)- 生成器函数的返回值是什么?
yield from是做什么的?- 生成器表达式和列表推导式有什么区别?
- 生成器的
send、throw、close方法有什么用? - 生成器为什么省内存,适合处理什么场景?
- 迭代器耗尽之后再次遍历会怎样?
- 哪些内置数据类型是可迭代的?
面向对象
- Python 的类有哪些特点?怎么理解 Python 的面向对象?(华为 / 腾讯)
- 封装、继承、多态在 Python 里分别怎么体现?(华为 / 快手 / 字节跳动)
- Python 的私有变量怎么实现?单下划线和双下划线有什么区别?
- 类变量和实例变量有什么区别?
- 类方法、实例方法、静态方法的区别和使用场景是什么?
__init__和__new__有什么区别,执行顺序是怎样的?(阿里巴巴 / 腾讯 / 华为)- Python 的构造函数和析构函数是什么?(字节跳动 / 华为)
- 一个对象的创建过程是怎样的?
self是什么?- Python 支持多继承吗?MRO 的顺序是怎样的?(华为)
- 菱形继承是怎么解决的?
super()是怎么工作的?(商汤 / 快手)- 魔术方法有哪些,各自什么时候被调用?
__slots__有什么用?- 元类是什么,什么时候会用到?
- Python 的反射机制是什么?(腾讯)
- Python 里有接口吗,抽象类怎么写?
- 怎么实现单例模式?
- Python 里怎么实现观察者模式?
- Python 里的类型注解有什么用,会影响运行吗?
内存管理与垃圾回收
- Python 的垃圾回收机制是怎样的?(字节跳动 / 阿里巴巴 / 百度)
- Python 的内存是怎么分配和回收的?(华为 / 字节跳动)
- 引用计数是怎么工作的,有什么缺点?
- 循环引用怎么处理?(快手 / 美团)
- 标记清除和分代回收分别解决什么问题?(华为 / 字节跳动 / 滴滴)
- 分代回收的三代是怎么划分的,什么时候触发?
- Python 的内存池机制是什么?
- Python 有内存泄漏吗?既然有 GC 为什么还会泄漏?(阿里巴巴)
- Python 程序的内存泄漏怎么排查和解决?(字节跳动 / 腾讯)
- 单进程内存溢出(OOM)怎么解决?(腾讯)
- Python 和 Java 在内存管理和 GC 上有什么区别?(字节跳动 / 华为 / 网易)
- Python 和 Go 的内存管理有什么区别?(字节跳动 / 阿里巴巴)
- Python 和 C 的垃圾回收机制一样吗?(中兴 / 快手)
- 弱引用
weakref是什么,解决什么问题? - Python 的堆和栈是怎么使用的?(华为 / 美团)
del一个变量会立即释放内存吗?
GIL 与并发编程
- GIL 是什么,为什么会有它?(华为 / 字节跳动 / 腾讯)
- GIL 的设计初衷是什么?(腾讯 / 华为)
- GIL 对 Python 并发有什么影响?(中兴 / 百度)
- GIL 是什么时候上锁、什么时候释放的?(字节跳动 / 快手)
- 为什么说 Python 没有真正意义上的多线程?(腾讯)
- Python 多线程怎么利用多核 CPU?(快手)
- 有了 GIL,线程里还需要加锁吗?(字节跳动 / 京东)
- 多线程和多进程怎么选?(百度 / 华为 / 字节跳动)
- IO 密集型和 CPU 密集型任务分别用线程、进程还是协程?(字节跳动 / 淘天)
- Python 里怎么创建线程?(华为 / 小米 / 百度)
threading模块里常用的类和方法有哪些?- 线程同步有哪些方式,锁、信号量、条件变量怎么用?
- 线程池和进程池分别怎么用,有什么优点?(华为 / 快手)
concurrent.futures是做什么的?- Python 多进程是怎么实现的?进程间怎么通信?(华为 / 美团)
Queue是线程安全的吗?- Python 里 dict 在多线程下是否安全,怎么保证?(字节跳动 / 京东)
ThreadLocal是做什么的?- 协程是什么,Python 里怎么创建协程?(腾讯 / 快手 / 科大讯飞)
asyncio的原理是什么,事件循环怎么工作?(腾讯 / 快手 / 商汤)async和await分别是什么意思?(腾讯 / 小米)asyncio.gather相比多线程有什么优势?(阿里巴巴)- 协程、线程、进程三者的区别是什么?
- 协程里调用了阻塞函数会怎样?
- 除了多进程,Python 还能怎么实现并发?
异常、文件与常用库
- Python 的异常处理怎么写,有哪些关键字?(百度)
try、except、else、finally的执行顺序是怎样的?- 怎么自定义异常?
- 怎么定位到具体是哪一行报的错?
assert断言是什么?- Python 常用的标准库有哪些?(中兴)
os和sys模块有什么区别?- 文件读取有哪些方式,大文件怎么读?(百度)
json里loads和dumps的区别是什么?- 正则表达式在 Python 里怎么使用?
re.match和re.search有什么区别?(京东 / 百度) - 怎么处理日期和时间?
pip和conda有什么区别?- Python 的
logging模块怎么配置? - Python 常用的第三方库有哪些?(字节跳动 / 华为)
numpy数组和 Python 列表有什么区别?pandas有哪些常用数据结构,怎么做聚合?(华为 / 快手 / 网易)- 怎么用 Python 连接数据库?(阿里巴巴)
- Python 怎么发送 HTTP 请求?
- Python 代码规范 PEP8 有哪些要求?
- Python 里的
pytest和unittest有什么区别,fixture是什么?
Web 框架
- Flask 和 Django 有什么区别?(知乎)
- Django、Flask、FastAPI 三者怎么选?
- Django 的 MVT 架构是什么?
- Django ORM 是什么,怎么避免 N+1 查询?
- Flask 的请求上下文是怎么实现的?
- Flask 的 session 怎么实现,和 JWT 怎么取舍?
- FastAPI 的异步是怎么实现的?(度小满 / 蚂蚁)
- FastAPI 里 Pydantic 校验的原理是什么?
- WSGI 和 ASGI 有什么区别?
- Gunicorn 为什么要用,worker 数怎么设置?
- Celery 是什么,一个任务从分发到执行的流程是怎样的?
- Celery 的 worker 宕机了,任务怎么恢复?
- Python 后端和 Java 后端有什么区别?(华为 / 腾讯)
- 浏览器访问一个 Flask 服务的完整流程是什么?
手撕与代码题
- 手写一个装饰器,统计函数运行时间。(腾讯 / 蔚来)
- 手写一个带重试的装饰器。(腾讯)
- 手写单例模式,并说明是否线程安全。
- 用 Python 实现二叉树的广度优先遍历。(腾讯 / 蔚来)
- 手写一个生成器函数,按需产出斐波那契数列。
- 用 Python 实现一个 LRU 缓存。
- 手写一个上下文管理器,退出时自动关闭资源。
- 一行代码展开二维列表。(地平线)
- 给列表去重并按从小到大排序。
- 判断一个字符串是不是回文。
- 找出字符串中最长的不重复子串。
- 合并两个字典,重复的 key 怎么处理?
- 统计字符串中每个字符出现的次数。
- 求两个列表的交集、并集和差集。
- 不用
for循环,求两个矩阵的欧氏距离(NumPy)。 - 用 NumPy 实现二分类交叉熵损失函数。
- 用线程池并发请求多个 URL,并按顺序收集结果。
- 用
asyncio同时起 20 个协程请求接口。 - 处理几十 GB 的文件,怎么用 Python 统计词频?
- 用 Python 删除目录下的指定文件。
笔试机考碰上这类手撕代码题
不用切屏:鼠标在「解题」按钮上停 1.2 秒,AI 读完题,把思路、复杂度和代码直接贴在考试页上方。
实现一个带参数的重试装饰器 retry(times):被装饰函数抛出异常时最多重试 times 次,次数用完仍失败就把最后一次异常抛出去。
示例:函数前两次抛 ValueError、第三次返回 3,@retry(3) 后调用结果为 3
AI 会自动截屏并解答
也可以直接按 Ctrl+Enter,手不用离开键盘
备考重点
Python 八股的核心特点是入门门槛低、追问往往直通解释器底层。GIL 与并发是出现频率最高的一块:几乎每场 Python 岗面试都会碰到,但很少停在"GIL 是什么",追问会落到"它保护了什么、什么时候释放、CPU 密集型怎么办、协程为什么能绕开"。这几个问题能讲清楚,整个并发部分就稳了。
建议按这条主线准备:先把一个对象从创建到销毁走一遍(__new__ 创建、__init__ 初始化、引用计数增减、循环引用交给分代 GC),再顺着每一步补"为什么"和"出问题会怎样"。可变与不可变、浅拷贝与深拷贝、默认参数陷阱这类小题,经常作为现场口述或看代码说输出的题出现,值得单独过一遍。
装饰器、闭包、生成器已经是常规必考项,不是加分项。能手写一个带参数的装饰器、说清 functools.wraps 为什么要加,比背出定义更能拿分。如果目标是后端岗,Web 框架部分(Flask 与 FastAPI 的异步模型、WSGI 与 ASGI、Celery 的任务流转)会是权重更高的一组;数据分析和算法岗则更偏向 numpy、pandas 的使用和手写代码题。
常见问题
这份题单是怎么整理出来的?
来源是公开面经,把 Python 方向反复出现的八股题抽出来重新归类,不包含面灵用户的面试内容。括号里标注的是近期实际问过这道题的大厂,只作参考,不代表完整名单。
Python 面试八股应该先准备哪些部分?
优先顺序建议是:GIL 与并发(线程、进程、协程的取舍)→ 装饰器与闭包 → 可变对象、拷贝与参数传递 → 垃圾回收与内存管理 → 迭代器与生成器 → 面向对象。这几块是各大厂 Python 岗的公共必考区,Web 框架、常用库再按目标岗位补。
面试官问 GIL,一般会追问到什么程度?
通常是三层:先问 GIL 是什么、为什么存在,再追问它保护了什么、什么时候释放、多线程为什么跑不满多核,最后落到取舍问题,比如 CPU 密集型和 IO 密集型分别怎么选线程、进程还是协程,以及有 GIL 的情况下共享数据还要不要加锁。能结合一个具体场景讲清选择理由,比背结论更容易拿分。
没有 Python 项目经验,这部分怎么准备?
优先吃透原理和对比关系(列表对元组、线程对进程对协程、深拷贝对浅拷贝),这是追问最集中的区域。再自己手写一遍带参数的装饰器和一个生成器,跑通之后再回答细节问题会踏实很多。
更多岗位合集
MySQL面试题与八股文汇总:230+ 道索引、事务、MVCC、锁、日志、慢查询高频真题分类整理(2026 面经)
面灵AI整理的 MySQL 八股合集,覆盖存储引擎、B+ 树与索引设计、联合索引与索引失效、事务与隔离级别、MVCC、锁与死锁、日志体系、主从复制、慢查询优化、分库分表与 SQL 手撕题,标注近期实际出题的大厂。
C++面试题与八股文汇总:205 道内存管理、虚函数、智能指针、STL 高频真题分类整理(2026 面经)
面灵AI整理的 C++ 八股合集,覆盖内存管理与指针、智能指针与 RAII、虚函数与多态、C++11 新特性与移动语义、STL 容器、关键字、编译链接、多线程与手撕题,标注近期实际出题的大厂。
运维面试题 / 运维八股 Top 25:运维与基础架构岗高频面经热度榜(2026 年 10 月版)
运维、SRE、基础架构岗位公开面经整理:25 道高频运维面试题与八股,标注热度等级和近期出题的知名大厂,附 Linux、网络、K8s、容器的答题框架。