当我尝试在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)允许包括参数周围的括号,但并不意味着它是函数调用.