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

Python中del操作与垃圾回收:为何删i不影响[1,2]但删t[0]却有影响?

关于Python中del操作的本质区别

先理清代码里的变量指向关系:

  • s = [[1, 2], [3, 6], [9, 6]] 创建了一个包含三个子列表的大列表对象,变量s指向这个对象。
  • t = s 不是复制新列表,而是让t和s指向同一个大列表对象,所以操作t等同于操作s。
  • i = s[0] 让变量i直接指向s列表的第一个子列表[1,2],此时[1,2]的有效引用有两个:一个来自大列表的第一个元素位置,另一个来自变量i。

再拆解两次del操作的本质:

  • del i:只是删除了变量i对[1,2]的引用,大列表的第一个元素仍然指向[1,2],所以[1,2]的引用计数没降到0,不会被垃圾回收,大列表的结构也没变化,所以看起来“没影响”。
  • del t[0]:这里删除的是大列表(t和s是同一个)中的第一个元素位置,也就是把大列表里指向[1,2]的那个引用给移除了。此时如果已经执行过del i,[1,2]的引用计数就变成0,会被垃圾回收;同时大列表的长度减少1,s和t都会变成[[3,6], [9,6]],所以看起来“产生了影响”——本质是大列表本身被修改了,而非[1,2]被回收的表象。

你之前的误解在于:把t[0]和s[0]当成了两个独立的引用,但实际上t和s指向同一个大列表,t[0]和s[0]是大列表里的同一个位置,属于同一个引用,所以[1,2]的引用总数是2,不是3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:15:28