Я заметил проблему, когда я пытался использовать del в лямбде для сокращения списка потоков просто тем, которые работают:
map(lambda x: del(x) if not x.isAlive() else x, self.threads)
Проигнорируйте в течение секунды, что это ничего не делает, я просто дурачусь с картой, уменьшаю, и лямбда.
Это перестало работать с синтаксической ошибкой в 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
Две проблемы. Первая более тонкая, поэтому я объясню ее сначала.
Проблема в том, что 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
была удалена из текущего пространства имен. Больше нет возможности обратиться к объекту, на который она указывала (при условии, что ничто другое не указывает на то же самое).
Во втором случае вы не удаляете a
из пространства имен. Вы удаляете привязку x
в пространстве имен функции, в результате чего вы больше не сможете использовать x
в качестве r-значения в функции (т.е. это неопределенная переменная).
Вторая проблема - SyntaxError
, которая проще. Функции Python lambda
могут содержать только выражения, но не утверждения. del
не является выражением (т.е. не является вызовом функции) - это утверждение (del_stmt
), поэтому оно не может появиться в теле лямбды. Вы увидите ту же проблему, если попробуете поместить print
в тело лямбды.
>>> lambda x: print x
File "<stdin>", line 1
lambda x: print x
^
SyntaxError: invalid syntax
Это также объясняет, почему x=del(a)
не работает. Синтаксис оператора некорректен. Это не функция, которую можно вызвать.
Ограничение состоит в том, что del
является оператором , а не выражением . Он не «возвращает значение», потому что в Python операторы не возвращают значения.
Форма лямбда
позволяет упоминать только выражения (поскольку перед выражением есть неявный return
), а форма def
допускает использование одного оператора функция должна быть указана в одной строке (как вы сделали с rmThis
).
Обычно del
используется без круглых скобок, как:
del x
Однако включение круглых скобок вокруг аргумента как del (x)
разрешено, но не означает, что это вызов функции. .