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

时间:2017-07-10 21:24:06

标签: python

我在Python中创建了一个列表

>>> my_list = [1, 2, 3, 4]

现在,如果我要删除列表,我想使用{/ 1}}运算符,如

del

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

>>> del my_list

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

2 个答案:

答案 0 :(得分:9)

del获取名称的目标列表,请参阅reference documentation

del_stmt ::=  "del" target_list

就像assignmentsfor loops一样,目标列表包括使用[...](...)列表和元组语法:

del (foo, bar)
del [spam, ham, eggs]

所以你没有订阅del,你正在删除一个名单。

你甚至可以嵌套它们:

del (foo, [ham, eggs])

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

完整的语法定义是:

target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target

所以del *names在技术上也是有效的,但编译器特殊情况下最后选择为SyntaxError

>>> foo = None
>>> del *foo
  File "<stdin>", line 1
SyntaxError: can't use starred expression here

答案 1 :(得分:6)

它没有索引。

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]]之类的操作,但它等同于del a, b, c