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

Python函数中对象id为何随调用变化?默认参数列表问题解析

Python函数默认列表参数的ID疑惑解析

嘿,我来帮你搞清楚这个问题!首先咱们先纠正一个小误解:你看到的id(L)显示不全并不是ID变了,而是输出被截断啦,实际两次调用的L指向的是同一个列表对象,完整ID是完全一致的~

核心原因:Python默认参数的初始化时机

Python里函数的默认参数是在函数定义的时候就创建并初始化的,而不是每次调用函数时重新生成。所以对于你的代码:

def f(a, L=[]):
    print(id(L))
    L.append(a)
    return L

当你写完这个函数定义的那一刻,默认的空列表[]就已经被创建出来了,每次调用f()如果不传L参数,都会复用这个已经存在的列表对象,它的ID自然不会变。你可以把print(id(L))改成print(f"完整ID: {id(L)}"),就能看到两次输出的ID完全相同啦。

为什么会有参数累积的现象?

因为列表是可变对象,每次调用L.append(a)都是直接修改这个默认列表本身,而不是创建新列表。所以第一次调用f(1)后,这个默认列表变成了[1];第二次调用f(1)时,还是操作同一个列表,就变成了[1, 1],这也侧面证明了它们是同一个对象。

如果不想让默认参数累积怎么办?

如果想每次调用都使用新的空列表,可以把默认参数设为None,然后在函数内部初始化:

def f(a, L=None):
    if L is None:
        L = []
    print(id(L))
    L.append(a)
    return L

这样每次调用如果不传L,都会在函数内部创建一个新的列表,每次的id(L)就会不一样啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:32:33