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

