You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python参数传递解析:为何两段append函数执行结果不同?

为什么这两个Python append函数的表现完全不同?

这个问题绝对是Python新手最容易踩的经典坑之一,核心原因在于Python默认参数的绑定时机——很多人误以为默认参数是每次调用函数时创建的,但实际上它是在函数定义的那一刻就初始化好了!

先看你提到的第一个函数:

def bad_append(new_item, a_list = []):
    a_list.append(new_item)
    return a_list

bad_append(1) # 返回 [1]
bad_append(2) # 返回 [1, 2]

当你写下def bad_append(...)这行代码的时候,Python就已经创建了那个空列表[],并且把它和参数a_list绑定在了一起。之后不管你调用多少次bad_append,只要不传第二个参数,用的都是同一个列表对象。第一次调用往里面加1,第二次接着往同一个列表里加2,结果自然会累加。

再看正确的写法good_append:

def good_append(new_item, a_list = None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list

这里用None作为默认参数——None是Python里的不可变单例对象,不会有“复用”的问题。每次调用函数时,如果不传第二个参数,a_list就会被设为None,这时候函数内部会新建一个全新的空列表。所以每次调用都是操作独立的列表,第一次返回[1],第二次返回[2],完全不会互相干扰。

总结一下:如果你的默认参数是可变对象(比如列表、字典),一定要避免直接把它作为默认值,而是用None当占位符,在函数内部动态创建新的可变对象——这才是符合Python idiom的写法!

内容的提问来源于stack exchange,提问作者yuqli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:30:45