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
相关产品推荐
相关产品推荐

