澄清python del如何用于列表和切片

时间:2017-03-18 11:53:56

标签: python list slice

阅读文档:

  

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[:])

如您所见,所有列表项实际上都是相同的对象。

2 个答案:

答案 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),它们是不同的对象。