十条Python面试题陷阱,看看你是否会中招

请问下,十条Python面试题陷阱,看看你是否会中招
最新回答
雾涣风月

2026-10-20 16:41:14

以下是十条Python面试题陷阱及解析:

问题1:类继承与__class__的误用

题目:如何修改代码使得调用类A的show方法?陷阱解析:

  • 错误方法:直接通过__class__修改类对象(如obj.__class__ = A),这会导致对象类型混乱,破坏继承链。
  • 正确做法:通过继承实现方法调用,例如让子类显式调用父类方法(super().show())或直接实例化父类。
问题2:__call__方法的必要性

题目:如何让对象实例能被直接调用?陷阱解析:

  • 错误认知:认为所有对象都能像函数一样直接调用。
  • 关键点:必须实现__call__方法,否则会触发TypeError: 'X' object is not callable。
问题3:__new__与__init__的混淆

题目:以下代码的输出是什么?陷阱解析:

  • 错误理解:认为__init__负责对象创建。
  • 关键点:__new__是静态方法,负责创建对象实例;__init__是初始化方法。单例模式中常用__new__控制实例生成。

问题4:列表推导式与字典生成式的边界

题目:以下代码输出什么?陷阱解析:

  • 错误预期:可能误判生成的数据结构类型。
  • 关键点:需明确[x for x in range(5)]生成列表,{x: x2 for x in range(5)}生成字典。

问题5:全局变量与局部变量的作用域

题目:以下代码输出什么?陷阱解析:

  • 错误假设:认为函数内可直接修改全局变量。
  • 关键点:函数内未声明global num时,num会被视为局部变量,导致UnboundLocalError。
问题6:一行代码交换变量的陷阱

题目:如何用一行代码交换两个变量?陷阱解析:

  • 错误写法:x, y = y, x虽简洁,但需注意可变对象(如列表)的引用问题。
  • 扩展场景:若变量涉及复杂计算,需确保表达式无副作用。
问题7:__getattr__的默认方法处理

题目:如何让未定义的方法调用mydefault?陷阱解析:

  • 错误实现:忽略参数传递(如def mydefault(self): pass)。
  • 关键点:需通过__getattr__动态处理,并使用*args兼容任意参数。
问题8:__init__.py控制包导入

题目:如何限制from demopack import *的导入内容?陷阱解析:

  • 错误操作:直接删除模块文件。
  • 正确方式:在__init__.py中定义__all__列表,明确可导出的模块名。
问题9:闭包与变量捕获的陷阱

题目:写一个函数返回另一个函数,计算输入与参数的积。陷阱解析:

  • 错误实现:未使用nonlocal或嵌套函数,导致变量无法共享。
  • 关键点:利用闭包特性,外层函数接收n,内层函数接收乘数。
问题10:Python2中字符串不可变性的隐患

题目:以下代码在Python2中的隐患是什么?陷阱解析:

  • 错误后果:循环中频繁创建新字符串对象,导致内存爆炸。
  • 优化建议:改用join()方法拼接字符串,或升级到Python3(优化了字符串处理)。
总结

以上问题覆盖了Python的核心概念(如作用域、闭包、元类)和常见误区(如变量修改、内存管理)。面试前需深入理解这些陷阱,避免机械记忆代码,而应掌握底层原理。