Python可变列表(Mutable List)与del关键字:为何删除l2后l1未被移除?
为什么执行del l2操作后,l1指向的列表对象没有被删除?
先看这段代码:
l1 = [1,2,3] l2 = l1 l1.append(4) l2.append(5) print(l1) # result: [1, 2, 3, 4, 5] print(l2) # result: [1, 2, 3, 4, 5]
这是因为列表是**可变(mutable)**对象,l1和l2其实指向内存里的同一个列表实例,所以对任意一个变量的修改都会同步影响另一个。
再看这段包含del操作的代码:
l1 = [1,2,3] l2 = l1 l1.append(4) l2.append(5) del l2 print(l1) # [1, 2, 3, 4, 5] print(l2) # NameError: name 'l2' is not defined
核心原因在于:
del l2删除的只是变量名l2,而非它指向的列表对象。- Python采用引用计数机制管理对象生命周期:只有当一个对象的所有引用都被移除(引用计数变为0)时,垃圾回收器才会销毁这个对象。
- 执行
del l2后,列表对象还有l1这个引用指向它,引用计数不为0,所以列表会继续存在,l1依然能正常访问它。而l2作为变量名已被删除,再次访问自然会触发NameError。
内容的提问来源于stack exchange,提问作者Yokanishaa
相关产品推荐
相关产品推荐

