以下是 2026年最新版 Python 面试题精选50道(涵盖基础 → 中级 → 高级),适合后端、数据分析、自动化测试、AI 等方向面试准备。建议先自己尝试回答,再对照解析巩固记忆。
我将题目分为三个梯度,便于分阶段复习:
- 1–20:基础 & 必知必会(社招/校招初筛常见)
- 21–35:中高级 & 原理向(中高级岗位重点)
- 36–50:高级 & 底层/性能/设计向(大厂/资深岗位高频)
每题后附简洁答案 + 考察点 + 追问方向,便于深度准备。
1–20 基础 & 必知必会
- Python 中列表和元组的区别?什么时候用哪个?
答:列表可变(mutable),元组不可变(immutable);列表用 [],元组用 ();元组可作为 dict 键、函数多返回值;列表适合动态增删,元组适合固定结构/常量/哈希。
考察:可变性、内存、哈希性 *args和**kwargs是什么?有什么用?
答:*args收集位置参数成元组,**kwargs收集关键字参数成字典;常用于函数装饰器、灵活接口、继承 super().init()。
追问:写一个接受任意参数的函数- Python 中
==和is的区别?
答:==比较值,is比较身份(id)。小整数/字符串有缓存机制,-5~256 整数、部分字符串is为 True。
高频追问:a = 257; b = 257; a is b结果? - 浅拷贝和深拷贝的区别?如何实现?
答:浅拷贝只复制第一层(copy.copy / 切片),深拷贝递归复制所有层(copy.deepcopy)。嵌套可变对象时深拷贝才真正独立。
代码:import copy; b = copy.deepcopy(a) - Python 中可变对象和不可变对象有哪些?
答:不可变:int、float、str、tuple、frozenset、bytes
可变:list、dict、set、bytearray、自定义类(未重写 hash 等) range()和xrange()的区别?(Python2 vs 3)
答:Python3 中range()就是 Python2 的xrange(),返回迭代器,内存友好;Python2range()返回列表。- Python 中
pass、break、continue的作用?
答:pass 占位符(空函数/类);break 跳出当前循环;continue 跳过本次循环进入下一次。 - 什么是 duck typing?
答:鸭子类型——“如果它走路像鸭子,叫声像鸭子,那么它就是鸭子”。关注行为而非类型,常用于协议/魔术方法。 __init__和__new__的区别?
答:__new__是静态方法,先创建实例(返回 cls 的实例),__init__初始化已创建的实例。通常只重写__init__,单例模式才重写__new__。- Python 中
@staticmethod、@classmethod、@property区别?
答:staticmethod 无隐式参数;classmethod 第一个参数是 cls;property 把方法伪装成属性(getter/setter/deleter)。 - Python 中的 GIL 是什么?对多线程有何影响?
答:全局解释器锁(Global Interpreter Lock)。同一时刻只有一个线程执行 Python 字节码。CPU 密集型任务多线程不加速,IO 密集型仍受益。 - Python 中常见的内存管理机制?
答:引用计数 + 分代垃圾回收(gc 模块)。小对象池(-5~256 整数、部分字符串)。 isinstance()和type()的区别?
答:isinstance(obj, (list, tuple))支持元组判断继承关系;type(obj)只返回确切类型。- Python 中列表推导式、字典推导式、生成器表达式写法?
答:[x**2 for x in range(10)] # 列表 {x: x**2 for x in range(10)} # 字典 (x**2 for x in range(10)) # 生成器 try...except...else...finally中 else 和 finally 的执行时机?
答:else 只在没有异常时执行;finally 无论是否异常都执行(常用于资源释放)。- Python 中
__slots__有什么用?
答:限制实例属性,节省内存(尤其大量小对象时),禁止__dict__。 - Python 中的命名空间有哪几种?LEGB 规则是什么?
答:Local → Enclosing → Global → Built-in
查找顺序:局部 → 闭包 → 全局 → 内置 - Python 中
nonlocal和global的作用?
答:nonlocal 修改外层函数(非全局)的变量;global 修改模块级变量。 - Python 中 sort() 和 sorted() 的区别?
答:sort() 是列表方法,原地排序返回 None;sorted() 是内置函数,返回新列表,可作用于任何可迭代对象。 - Python 中如何实现单例模式?(至少两种方式)
答:
方式1:重写__new__
方式2:装饰器 / 元类 / 模块导入(最常用)
21–35 中高级 & 原理向
- Python 中描述符(Descriptor)是什么?property 底层原理?
答:实现了__get__、__set__、__delete__的类。property 就是描述符的简化写法。 - Python 中元类(metaclass)是什么?常见使用场景?
答:创建类的类(type 是最常见的元类)。ORM(如 Django Model)、自动注册、属性校验。 - Python 中的 MRO(方法解析顺序)是什么?C3 线性化算法?
答:多继承时方法查找顺序。Python3 全用 C3(合并+拓扑排序)。 - Python 中
__getattribute__和__getattr__区别?
答:__getattribute__每次属性访问都调用;__getattr__只在普通查找失败时调用。 - Python 中生成器和迭代器的区别?如何自定义迭代器?
答:迭代器实现__iter__和__next__;生成器是迭代器的简写(yield)。生成器自动实现迭代器协议。 @functools.lru_cache原理和使用场景?
答:最近最少使用缓存装饰器,常用于递归(如斐波那契)、避免重复计算昂贵函数。- Python 中协程、生成器、async/await 的关系?
答:生成器 → 协程基础;Python 3.5+ 用 async def / await 实现原生协程(基于生成器)。 - Python 中 contextmanager 和 with 语句底层原理?
答:实现了__enter__和__exit__的对象;@contextmanager 装饰器把生成器转为上下文管理器。 - Python 中 pickle 和 json 的区别?安全性?
答:pickle 可序列化任意 Python 对象(包括函数、类),但不安全(反序列化可执行代码);json 只支持基本类型,跨语言、安全。 - Python 中
__mro__、__bases__、__subclasses__()分别是什么?
答:mro 方法解析顺序元组;bases 直接基类元组;subclasses() 当前类的直接子类列表。 - Python 中内存泄漏的常见原因?如何排查?
答:循环引用 + 未清理全局变量/缓存;大对象未释放;线程/协程泄漏。
工具:objgraph、heapy、tracemalloc、gc.get_objects() - Python 中多进程 vs 多线程 vs 多协程适用场景?
答:CPU 密集 → 多进程(multiprocessing);IO 密集 → 多线程/协程(asyncio);混合 → ProcessPoolExecutor + asyncio。 - Python 中如何实现异步 IO?常见库?
答:asyncio + aiohttp + aiomysql 等;或 trio/curio。 - Python 中常见的 WSGI/ASGI 服务器有哪些?
答:WSGI:gunicorn + uvicorn;ASGI:uvicorn、hypercorn、daphne。 - Python 中装饰器带参数怎么写?
答:三层嵌套,最外层接收参数,返回真正的装饰器函数。
36–50 高级 & 底层/性能/设计向
- Python 中整数对象在内存中如何存储?大整数如何处理?
答:小整数缓存池;大整数用 ob_digit 数组(30位一组)实现任意精度。 - Python 中字符串 intern 机制?
答:编译时常量字符串、部分运行时字符串会 intern(放入 interned 池),相同内容指向同一对象。 - Python 中 dict 底层实现?为什么 Python 3.7+ dict 有序?
答:3.6 前 hash table + 开放寻址;3.7+ 插入顺序维护(compact dict + indices 数组)。 - Python 中 set 和 dict 的底层数据结构?
答:都是哈希表,set 是 dict 的 value 为 dummy 的特例。 - Python 中列表 append 操作的时间复杂度?扩容策略?
答:均摊 O(1);扩容策略:2倍或 1.125 倍(Python 3.3+ 更平滑)。 - Python 中如何实现一个高性能的 LRU Cache?
答:collections.OrderedDict + move_to_end();或 functools.lru_cache(maxsize=128) - Python 中如何避免循环导入(circular import)?
答:延迟导入(函数内 import);重构模块;使用 importlib.import_module - Python 中常见的 monkey patch 使用场景?
答:测试 mock、热修复线上 bug、临时修改第三方库行为。 - Python 中如何实现一个线程安全的单例?
答:加锁(threading.Lock) + 双检锁;或用模块导入天然单例。 - Python 中垃圾回收的阈值机制(generation)?
答:三代:0代(频繁)、1代、2代;阈值可通过 gc.set_threshold() 调整。 - Python 中如何调试内存泄漏?
答:tracemalloc + snapshot;objgraph.show_most_common_types();memory_profiler - Python 中 Cython、Numba、PyPy 的区别和适用场景?
答:Cython → 静态编译到 C;Numba → JIT 编译数值计算;PyPy → 解释器带 JIT,全局提速。 - Python 中如何实现一个简单的协程调度器?
答:用生成器 + yield + send;或直接用 asyncio 的 event loop。 - Python 中常见的反序列化漏洞(pickle RCE)如何防范?
答:永远不要 pickle untrusted data;用 json/yaml/toml;或限制 pickle 的允许类。 - 如果让你设计 Python 的包管理工具(pip 的竞品),你会怎么考虑?
答:依赖解析(SAT solver)、锁文件(requirements.txt → poetry.lock)、环境隔离(venv)、缓存、增量安装、跨平台一致性、支持 git/monorepo 等。
建议收藏 & 刷题节奏:
- 第一遍:快速过 1–20,默写关键代码
- 第二遍:深入 21–35,画图理解 MRO、描述符、GIL
- 第三遍:重点攻 36–50 + 手写 LRU / 单例 / 上下文管理器
- 每天 5–10 道 + 代码实现 + 追问准备
祝你面试顺利,拿到心仪 offer!
有想重点讲解/手写代码的题目,评论告诉我~