🐍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,不会解释场景 - 不知道默认值在定义时求值