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

Him*_*hra 2 python

我在Python中创建了一个列表

>>> my_list = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

现在,如果我想删除列表,我想使用del运算符

>>> del my_list
Run Code Online (Sandbox Code Playgroud)

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

>>> del[my_list]
Run Code Online (Sandbox Code Playgroud)

而这也是一样的!而现在我有点困惑del del实际工作.我可以del通过内置语句理解以前的语法,但第二种语法看起来像是对我的索引.

Mar*_*ers 9

del获取目标名称列表,请参阅参考文档:

del_stmt ::=  "del" target_list
Run Code Online (Sandbox Code Playgroud)

就像赋值for循环一样,目标列表包括using [...](...)list和tuple语法:

del (foo, bar)
del [spam, ham, eggs]
Run Code Online (Sandbox Code Playgroud)

所以你没有订阅del,你删除了一个名单.

你甚至可以嵌套它们:

del (foo, [ham, eggs])
Run Code Online (Sandbox Code Playgroud)

重新使用现有语法规则比将语法严格限制为以逗号分隔的名称列表更简单.

完整的语法定义是:

target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
Run Code Online (Sandbox Code Playgroud)

所以del *names在技​​术上也是有效的,但编译器特殊情况,最后选项是一个SyntaxError:

>>> foo = None
>>> del *foo
  File "<stdin>", line 1
SyntaxError: can't use starred expression here
Run Code Online (Sandbox Code Playgroud)


use*_*ica 6

它没有索引.

del使用东西时,您可以指定一次删除多个内容:

del a, b
Run Code Online (Sandbox Code Playgroud)

您还可以使用括号或括号括起删除目标:

del [a, b]
del (a, b)
Run Code Online (Sandbox Code Playgroud)

即使只有一个删除目标,您也可以这样做:

del [a]
Run Code Online (Sandbox Code Playgroud)

此行为主要反映赋值,其中可选括号或括号对嵌套解包很有用:

nested_tup = (1, (2, 3))
[a, [b, c]] = nested_tup
Run Code Online (Sandbox Code Playgroud)

虽然你在技术上被允许做类似的事情del [a, [b, c]],但它相当于del a, b, c.