Python:`del my_list`vs`del[my_list]`

Python:`del my_list`vs`del[my_list]`,python,Python,我已经用Python创建了一个列表 >>> my_list = [1, 2, 3, 4] 现在,如果我想删除列表,我想使用del操作符 >>> del my_list 这很好,可能是使用它的一般方式。但在某个地方我偶然发现了一个不寻常的语法 >>> del[my_list] 这也是同样的道理!现在我有点困惑del到底是怎么工作的。我可以理解前面的语法,del是一个内置语句,但第二个语法在我看来像是一个索引。它不是索引 当删除内容时,您可

我已经用Python创建了一个列表

>>> my_list = [1, 2, 3, 4]
现在,如果我想删除列表,我想使用
del
操作符

>>> del my_list
这很好,可能是使用它的一般方式。但在某个地方我偶然发现了一个不寻常的语法

>>> del[my_list]
这也是同样的道理!现在我有点困惑del到底是怎么工作的。我可以理解前面的语法,
del
是一个内置语句,但第二个语法在我看来像是一个索引。

它不是索引

当删除内容时,您可以指定一次删除多个内容:

del a, b
您还可以用括号或圆括号括住删除目标:

del [a, b]
del (a, b)
即使只有一个删除目标,您也可以这样做:

del [a]
此行为主要反映赋值的行为,其中可选的括号或括号对于嵌套的解包非常有用:

nested_tup = (1, (2, 3))
[a, [b, c]] = nested_tup
虽然技术上允许您执行类似于
del[a[b,c]
的操作,但它相当于
dela,b,c

del
获取目标名称列表,请参见:

与for and一样,目标列表包括使用
[…]
(…)
列表和元组语法:

del (foo, bar)
del [spam, ham, eggs]
因此,您不是在订阅
del
,而是在删除名称列表

您甚至可以将其嵌套:

del (foo, [ham, eggs])
重复使用现有语法规则比严格将语法限制为逗号分隔的名称列表更简单

完整的语法定义是:

因此,
del*names
在技术上也是有效的,但是编译器的最后一个选项是
SyntaxError

>>> foo = None
>>> del *foo
  File "<stdin>", line 1
SyntaxError: can't use starred expression here
>foo=None
>>>德尔福
文件“”,第1行
SyntaxError:此处不能使用带星号的表达式

del[my_list]
del[my_list]
是一个目标列表。这不是索引,这是构造一个列表然后删除它,但我相信当您在delete命令中构造一个iterable时,它会删除iterable中的所有内容。
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
>>> foo = None
>>> del *foo
  File "<stdin>", line 1
SyntaxError: can't use starred expression here