Python 中一个隐蔽的陷阱:可变默认参数
你是否遇到过这种情况:函数的行为似乎会“记住”上一次调用的数据?问题可能出在可变默认参数上。
问题的现象
def add_item(item, my_list=[]):
my_list.append(item)
return my_list
print(add_item('apple')) # ['apple']
print(add_item('banana')) # ['apple', 'banana'] 咦?
为什么会出现这种情况?
在Python中,默认参数在函数定义时就被求值并创建,而不是每次调用时重新创建。这意味着,当你使用可变对象(如列表、字典)作为默认参数时,所有函数调用实际上都在操作同一个对象!
正确的解决方案
方案一:使用None作为默认值
def add_item(item, my_list=None):
if my_list is None:
my_list = []
my_list.append(item)
return my_list
方案二:明确创建副本
def process_data(data, config={
}):
config = config.copy() # 创建副本
# 处理逻辑
总结
记住这个简单的原则:永远不要使用可变对象作为函数默认参数。使用None替代,然后在函数内部初始化,这是Python社区的标准做法。
这个小技巧不仅能避免bug,还能让你更深入理解Python的函数机制。下次代码审查时,不妨留意一下这个常见的陷阱!