阅读文档:
del:删除目标列表会从左到右递归删除每个目标。
您能否阐明为什么此代码可以正常工作?
a = [1,2,3]
c = a[:]
del c
print a
del a[:]
print a
Run Code Online (Sandbox Code Playgroud)
打印:
[1, 2, 3]
[]
Run Code Online (Sandbox Code Playgroud)
如果切片是指向原始列表中相同元素的新列表,那么为什么删除切片的变量赋值不会使之为a空,以及为什么删除未引用的切片会删除的元素a?
UPD
# -*- 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[:])
Run Code Online (Sandbox Code Playgroud)
印刷品:
list id: 26945296
list of item ids:
id: 23753600; value: 1
id: 23753588; value: 2
id: 23753576; value: 3
list id: 26920560
list of item ids:
id: 23753600; value: 1
id: 23753588; value: 2
id: 23753576; value: 3
list id: 26946136
list of item ids:
id: 23753600; value: 1
id: 23753588; value: 2
id: 23753576; value: 3
Run Code Online (Sandbox Code Playgroud)
如您所见,所有列表项实际上都是相同的对象。
这是您正在做的事情:
a = [1,2,3]
Run Code Online (Sandbox Code Playgroud)
创建新的列表对象。创建a指向它的名称。
c = a[:]
Run Code Online (Sandbox Code Playgroud)
创建列表对象的副本。创建c指向它的名称。
del c
Run Code Online (Sandbox Code Playgroud)
删除名称c。它以前指向的对象现在是垃圾,最终将被收集。这对第一个对象没有影响。
print a
Run Code Online (Sandbox Code Playgroud)
打印a指向第一个对象的对象。
del a[:]
Run Code Online (Sandbox Code Playgroud)
删除a指向该对象的所有元素。现在它是一个空列表。
print a
Run Code Online (Sandbox Code Playgroud)
打印空白列表。
那么,这些行之间有什么区别?
del c
del a[:]
Run Code Online (Sandbox Code Playgroud)
第一行从名称空间中删除名称。第二行从对象中删除元素。
编辑:我知道,您不清楚他们为什么要那样做。摘自《Python语言参考》第6.5节:
名称的删除会从本地或全局名称空间中删除该名称的绑定,具体取决于该名称是否出现在同一代码块的`global`语句中。如果名称是未绑定的,将引发`NameError`异常。
这就是您跑步时发生的情况del c。
属性引用,订阅和切片的删除被传递给所涉及的主要对象;切片的删除通常等效于分配正确类型的空切片(但即使这由切片的对象确定)。
这就是您跑步时发生的情况del a[:]。