I noticed a problem when I was trying to use del in a lambda to thin out a list of threads to just those running:
map(lambda x: del(x) if not x.isAlive() else x, self.threads)
Ignore for a second that this doesn’t do anything, I’m just fooling around with map, reduce, and lambda.
This fails with a syntax error at del(x). With some messing around, I think the problem is del() doesn’t return a value. For example, this fails with the same error:
b = 5
x = del(b)
This doesn’t, however:
def rmThis(x): del(x)
Which means I’m using this workaround:
map(lambda x: rmThis(x) if not x.isAlive() else x, self.threads)
So is the limitation just because del() doesn’t return a value? Why not?
I’m using python 2.6.2
Two problems. The first one is more subtle so I’ll explain that first.
The issue is that del removes a variable binding. Passing it a value will not serve your purpose.
Here’s an illustration
As you can see. In the first case, the variable
ahas been removed from the current namespace. There’s no way to refer to the object it pointed to anymore (assuming nothing else points to the same thing).In the second case, you are not removing
afrom the namespace. You are deleting the binding ofxin the function namespace the effect of which is that you won’t be able to usexas as an rvalue anymore in the function (ie. it’s an undefined variable).The second problem is the
SyntaxErrorwhich is simpler. Pythonlambdafunctions can only have expressions in them and not statements.delin not an expression (i.e., not a function call) – it’s a statement (thedel_stmt) and so it can’t appear in the body of the lambda. You’d see the same issue if you tried putting aprintin the body of the lambda.This also accounts for why the
x=del(a)fails. The statement syntax is invalid. It’s not a function that can be called.