这份清单精选了 50 道 Python 高频面试题,覆盖从基础语法到底层原理的完整知识体系。为了方便分阶段复习,题目按难度划分为三个梯度,适合后端、数据分析及 AI 方向求职者系统准备。
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)只返回确切类型。 -
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:装饰器 / 元类 / 模块导入(最常用) -
Python 中列表推导式、字典推导式、生成器表达式写法?
[x**2 for x in range(10)] # 列表 {x: x**2 for x in range(10)} # 字典 (x**2 for x in range(10)) # 生成器
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 等。

