Python列表的对象ID分配问题:为何重复创建列表ID不唯一?
Python中多次创建相同内容列表为何对象ID不一致?
首先明确两个核心点:
- 列表是可变对象,Python不会对可变对象做自动缓存复用(这和小整数、字符串常量池的机制完全不同)
- 对象ID对应的是内存地址,当一个对象没有任何引用时,会被垃圾回收器回收,其占用的内存会被重新分配
结合你的代码和输出具体解释:
- 第一次执行
id([1,2,3]):创建的是临时列表对象,调用id()后这个对象没有被任何变量引用,执行完这条print语句就被立刻回收,对应的内存地址140117092252416被释放。 - 执行
a = [1,2,3]:此时创建新列表,刚好复用了刚才释放的内存地址,所以id(a)和第一次的临时列表ID完全相同。 - 第三次执行
id([1,2,3]):因为变量a还持有之前的列表引用,那块内存地址仍被占用,Python只能分配新的内存给这个临时列表,ID自然就变了。 - 最后
id(a)不变,是因为a一直引用着最初创建的那个列表对象,只要引用没断,它的内存地址就不会被回收复用。
简单总结:临时对象的ID重复是因为垃圾回收及时释放了内存,新对象复用了地址;而当旧对象还被引用时,新对象只能使用新的内存地址。
你的演示代码:
print('id([1, 2, 3])= ', id([1, 2, 3])) a = [1, 2, 3] print('a= ', a) print('id(a)= ', id(a)) print('id([1, 2, 3])= ', id([1, 2, 3])) print('id(a)= ', id(a))
终端输出:
id([1, 2, 3])= 140117092252416 a= [1, 2, 3] id(a)= 140117092252416 id([1, 2, 3])= 140117090393920 id(a)= 140117092252416
内容的提问来源于stack exchange,提问作者Zip
相关产品推荐
相关产品推荐

