9

当我尝试在 lambda 中使用 del 将线程列表精简为仅运行的线程时,我注意到了一个问题:

map(lambda x: del(x) if not x.isAlive() else x, self.threads)

暂时忽略这没有任何作用,我只是在玩弄 map、reduce 和 lambda。

这将失败并在 del(x) 处出现语法错误。由于有些混乱,我认为问题在于 del() 没有返回值。例如,这失败并出现相同的错误:

b = 5
x = del(b)

然而,这不是:

def rmThis(x): del(x)

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

map(lambda x: rmThis(x) if not x.isAlive() else x, self.threads)

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

我正在使用 python 2.6.2

4

2 回答 2

14

限制是那del是一个语句而不是一个表达式。它不会“返回值”,因为 Python 中的语句不会返回值。

lambda表单只允许您提及表达式(因为return在表达式之前有一个隐式),而该def表单允许在一行上指定单个语句函数(就像您对 所做的那样rmThis)。

通常del不带括号使用,如:

del x

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

于 2010-05-24T08:17:52.610 回答
13

两个问题。第一个比较微妙,所以我先解释一下。

问题是 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
>>> 

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

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

第二个问题是SyntaxError哪个更简单。Pythonlambda函数中只能有表达式,不能有语句。delin 不是一个表达式(即,不是一个函数调用)——它是一个语句(the del_stmt),所以它不能出现在 lambda 的主体中。如果您尝试将 aprint放入 lambda 的主体中,您会看到同样的问题。

>>> lambda x: print x
  File "<stdin>", line 1
    lambda x: print x
                  ^
SyntaxError: invalid syntax

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

于 2010-05-24T08:24:23.047 回答