Python面试题更新 2026-08-03

在官方 CPython 环境下,请推断并说明以下代码会输出什么结果?

考察说明

考察对 CPython 内存管理和对象引用机制的深入理解。

回答思路

  1. 【回答框架 1】在官方的 CPython 解释器中,整数的对象分配和小整数缓存(小整数对象池)机制会影响程序的输出。具体而言,Python 对 -5 到 256 范围内的小整数进行了缓存,即这些整数是单例对象,而超出此范围或计算结果产生的整数则可能创建新对象。
  2. 【回答框架 2】代码的执行流程会直接影响对象的身份比较(is 操作)结果。is 比较的是两个对象的身份(内存地址),而 == 比较的是值。因此,需要根据每一行代码中变量所绑定的对象是来自缓存还是新建对象来判断 is 的返回值。
  3. 【回答框架 3】在命令行交互环境(REPL)中,每行代码的编译和执行是独立的,但对象池和引用计数是全局的。对于同一行代码中赋值的变量,可能因为优化而共享对象;而跨行代码则可能产生不同的行为。
  4. 【回答框架 4】最终结果需要结合 Python 的字节码编译和优化(如常量折叠)来综合判断。例如,整数运算在编译时可能被折叠为常量,从而影响 is 结果。
  5. 【关键点 1】小整数对象缓存范围是 -5 到 256,该范围内的整数是单例对象,is 比较返回 True。
  6. 【关键点 2】is 比较的是对象身份,而 == 比较的是值,两者结果可能不同。
  7. 【关键点 3】CPython 的字节码优化(如窥孔优化)可能对常量进行折叠,影响对象创建。
  8. 【关键点 4】具体结果取决于每一行代码中变量赋值时对象是否来自缓存或新建,需逐行分析。
  9. 【易错点 1】不能笼统认为所有整数 is 比较都为 True,超出缓存范围的整数通常会产生新对象。
  10. 【易错点 2】不能忽视 REPL 与脚本文件执行环境的差异,这可能导致结果不同。
  11. 【易错点 3】计算表达式(如 257*1)可能被优化为常量,但实际行为需以 CPython 版本为准。