阅读文档:
del:删除目标列表以递归方式删除每个目标 从左到右。
你能说明为什么这段代码有效吗?
a = [1,2,3]
c = a[:]
del c
print a
del a[:]
print a
打印:
[1, 2, 3]
[]
如果切片是指向原始列表的相同元素的新列表,那么为什么删除切片的变量赋值不会使a
为空以及为什么删除未引用的切片会删除{{1}的元素}}?
UPD
a
打印:
# -*- coding: utf-8 -*-
a = [1,2,3]
c = a[:]
def list_info(lst):
print "list id: {}".format(id(lst))
print "list of item ids:"
for item in lst:
print "id: {}; value: {}".format(id(item), item)
print ""
list_info(a)
list_info(c)
list_info(a[:])
如您所见,所有列表项实际上都是相同的对象。
答案 0 :(得分:4)
以下是您正在做的事情:
a = [1,2,3]
创建新的列表对象。创建指向它的名称a
。
c = a[:]
创建列表对象的副本。创建指向它的名称c
。
del c
删除名称c
。它过去指向的对象现在是垃圾,最终将被收集。这对第一个对象没有影响。
print a
打印a
指向的第一个对象。
del a[:]
删除a
指向的对象的所有元素。它现在是一个空列表。
print a
打印空列表。
那么,这些线之间的区别是什么?
del c
del a[:]
第一行从命名空间中删除名称。第二行 从对象中删除元素。
编辑:我明白了,你不明白为什么他们这样做。来自JSFiddle:
删除名称会删除该名称与该名称的绑定 本地或全局命名空间,具体取决于名称是否出现在 `global`语句在同一个代码块中。如果名称未绑定,则a 将引发`NameError`异常。
当你运行del c
时会发生这种情况。
删除属性引用,订阅和切片传递给所涉及的主对象;删除切片通常等同于分配正确类型的空切片(但即使这是由切片对象确定的)。
当你运行del a[:]
时会发生这种情况。
答案 1 :(得分:0)
来自doc:
list.clear()从列表中删除所有项目。相当于del a [:]。
del a[:]
等于a.clear()
您可以尝试打印id(a)
和id(c)
,它们是不同的对象。