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

Python空列表默认参数使用append与+运算符的行为差异原因求解

Python可变默认参数的行为差异原因

核心前提:Python函数默认参数的初始化规则

Python的函数默认参数是在函数定义阶段完成初始化的,而非每次调用函数时重新生成。对于列表、字典这类可变类型的默认参数,所有未主动传入该参数的函数调用,都会共享同一个初始化时生成的对象。


1. append方法的累加行为说明

append()是列表的原地修改方法,操作不会生成新的列表对象,直接修改原对象的内容:

  • 第一次调用append_to(5)时,未传入my_list,使用定义时生成的默认空列表对象,经过append操作后,该对象本身被修改为['0','1','2','3','4']并返回。
  • 第二次调用append_to(10)时,仍然使用同一个默认列表对象(此时已经存储了第一次调用添加的5个元素),继续执行append操作,就会在原有内容的基础上新增10个元素,最终输出两次调用累加的结果。

2. "+"运算符无累加的行为说明

列表的+运算会生成一个全新的列表对象,不会修改参与运算的任意一个原列表:

  • 第一次调用append_to(5)时,初始my_list指向默认的空列表对象,执行my_list = my_list + [str(i)]时,会生成一个新的列表对象,赋值给局部变量my_list,此时局部变量my_list已经不再指向原来的默认空列表对象。整个过程中,初始的默认空列表对象没有被任何修改操作影响,始终保持空状态。
  • 第二次调用append_to(10)时,还是使用从未被修改的默认空列表对象作为初始值,因此最终返回的是仅包含本次新增的10个元素的列表。

最佳实践

如果需要使用可变类型作为函数默认参数,推荐默认值设置为None,在函数内部每次调用时初始化新的可变对象,避免共享对象导致的异常:

def append_to(n, my_list = None):
    if my_list is None:
        my_list = []
    for i in range(n):
        my_list.append(str(i))
    return my_list

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:39:02