🐍Python 函数与面向对象

函数参数与默认参数陷阱

面试回答

常见问法

Python 函数参数有哪些规则?为什么默认参数经常出坑?

回答

Python 常见参数类型有:

  • 位置参数
  • 默认参数
  • 可变位置参数 *args
  • 关键字参数
  • 可变关键字参数 **kwargs
  • 仅位置参数 /
  • 仅关键字参数 *

默认参数的高频坑在于:默认值在函数定义时求值,而不是每次调用时重新创建。

def append_item(x, items=[]):
    items.append(x)
    return items

这个 items 会在多次调用之间共享。

追问

  • 为什么默认参数只求值一次
  • 为什么常见修复写法是 None
  • *args**kwargs 在接口设计里的价值是什么

原理展开

安全写法通常是:

def append_item(x, items=None):
    if items is None:
        items = []
    items.append(x)
    return items

这样每次不传参时都会得到一个新的列表。

Python 3 还支持更精细的参数约束:

def func(a, /, b, *, c):
    return a, b, c

这里:

  • a 只能位置传
  • c 只能关键字传

面试里讲参数规则时,重点不是把语法背全,而是说明: “Python 接口设计很强调调用约束和可读性,默认参数陷阱本质上是对象生命周期和绑定时机问题。”

易错点

  • 用可变对象做默认参数
  • 只会背 *args**kwargs,不会解释场景
  • 不知道默认值在定义时求值