为何Python中id()对不同对象返回相同值?函数调用id异常咨询
Python函数默认参数与列表ID的异常现象解析
测试代码
def add_item(list_x=[]): list_x = list_x + [3] print(list_x) print(id(list_x)) add_item() add_item([1,2]) add_item() add_item([5,6]) add_item()
预期与实际差异
原本预期第一次调用生成的列表和第三次调用的列表ID相同,但实际第二次与第三次调用的ID相同,第四次与第五次调用的ID也相同。
运行输出
[3] 140010993189184 [1, 2, 3] 140010993171520 [3] 140010993171520 [5, 6, 3] 140010993159232 [3] 140010993159232
原因解释
- 默认参数的创建逻辑:Python函数的默认参数是在函数定义时生成的,但你的代码并没有修改这个默认列表——
list_x = list_x + [3]是生成一个全新的列表对象,而非修改原默认列表。 - 列表拼接的本质:
+操作符会合并两个列表并返回新列表,所以每次执行这句代码都会生成新对象,原默认列表始终为空,从未被改动。 - 内存地址复用机制:Python的垃圾回收会回收不再被引用的对象内存。第二次调用生成的
[1,2,3]在打印后失去引用,内存被释放;第三次调用生成的[3]刚好复用了这块释放的内存,因此ID相同。同理,第四次调用的[5,6,3]被回收后,第五次的[3]复用了它的地址。 - 对比修改原列表的情况:如果把代码改成
list_x.append(3),这才是直接修改默认参数的列表对象,此时第一次和第三次调用的ID会一致,因为操作的是同一个列表。
内容的提问来源于stack exchange,提问作者Bhuvana ravula
相关产品推荐
相关产品推荐

