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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:22:32