阐明python del如何工作于列表和切片

Ale*_*kin 2 python list slice

阅读文档:

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)

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

Tom*_*ych 6

这是您正在做的事情:

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