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

