Python del()内置不能用于赋值?

emc*_*cee 8 python built-in

当我尝试在lambda中使用del来将一个线程列表稀疏到正在运行的那些线程时,我注意到了一个问题:

map(lambda x: del(x) if not x.isAlive() else x, self.threads)
Run Code Online (Sandbox Code Playgroud)

忽略一秒,这没有做任何事情,我只是在搞乱map,reduce和lambda.

这失败,del(x)处出现语法错误.随着一些搞乱,我认为问题是del()不返回值.例如,这失败并出现相同的错误:

b = 5
x = del(b)
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

def rmThis(x): del(x)
Run Code Online (Sandbox Code Playgroud)

这意味着我正在使用此解决方法:

map(lambda x: rmThis(x) if not x.isAlive() else x, self.threads)
Run Code Online (Sandbox Code Playgroud)

那么限制只是因为del()不返回值?为什么不?

我正在使用python 2.6.2

Nou*_*him 12

两个问题.第一个是更微妙的,所以我先解释一下.

问题是del删除了变量绑定.传递一个值不符合您的目的.

这是一个例子

>>> a = 5
>>> del(a)
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> def mydel(x): del(x)
... 
>>> a = 5
>>> mydel(a)
>>> a
5
>>> 
Run Code Online (Sandbox Code Playgroud)

如你看到的.在第一种情况下,该变量 a已从当前名称空间中删除.没有办法再引用它指向的对象(假设没有其他东西指向同一个东西).

在第二种情况下,您不是a从命名空间中删除.您正在删除x函数名称空间中的绑定,其效果是您将无法x再在函数中使用rvalue(即,它是一个未定义的变量).

第二个问题是SyntaxError哪个更简单.Python lambda函数只能在其中包含表达式而不能包含语句.del不是表达式(即,不是函数调用) - 它是一个语句(the del_stmt),因此它不能出现在lambda的主体中.如果你尝试print在lambda的主体中放置一个,你会看到同样的问题.

>>> lambda x: print x
  File "<stdin>", line 1
    lambda x: print x
                  ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

这也解释了x=del(a)失败的原因.语句语法无效.它不是可以调用的函数.


Gre*_*ill 11

该限制是del一个声明,而不是表达.它不会"返回值",因为语句不会在Python中返回值.

lambda表格只允许你提到的表达式(因为有一个隐含return的表达之前),而def形式允许在同一行中指定单个语句的功能(如你有做rmThis).

通常del在没有括号的情况下使用,如:

del x
Run Code Online (Sandbox Code Playgroud)

但是,del(x)允许包括参数周围的括号,但并不意味着它是函数调用.