Python 中一个隐蔽的陷阱:可变默认参数

简介: Python 中一个隐蔽的陷阱:可变默认参数

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的函数机制。下次代码审查时,不妨留意一下这个常见的陷阱!

相关文章
|
1月前
|
Python
Python类型提示:让代码更清晰、更可靠
Python类型提示:让代码更清晰、更可靠
259 133
|
1月前
|
Python
告别繁琐字符串拼接:Python f-string 的优雅之道
告别繁琐字符串拼接:Python f-string 的优雅之道
245 133
|
1月前
|
数据采集 开发者 Python
Python异步编程:解锁高性能并发新姿势
Python异步编程:解锁高性能并发新姿势
234 133
|
6天前
|
索引 Python
5个提升效率的Python技巧
5个提升效率的Python技巧
243 134
|
6天前
|
SQL 安全 大数据
PHP开发中的几个实用技巧
PHP开发中的几个实用技巧
219 134
|
6天前
|
索引 Python
五个提升效率的Python技巧
五个提升效率的Python技巧
280 134
|
6天前
|
Go
Go 空结构体的魔力:不占内存的优雅用法
Go 空结构体的魔力:不占内存的优雅用法
213 134
|
6天前
|
安全 PHP 开发者
利用PHP 8的Union Types和Match表达式编写更干净的代码
利用PHP 8的Union Types和Match表达式编写更干净的代码
278 136
|
1月前
|
存储 缓存 监控
Python装饰器:让代码更优雅的魔法工具
Python装饰器:让代码更优雅的魔法工具
189 132
|
1月前
|
数据采集 安全 调度
Python异步编程入门:asyncio实战指南
Python异步编程入门:asyncio实战指南
193 133

热门文章

最新文章