Python del () встроенный не может использоваться в присвоении?

Я заметил проблему, когда я пытался использовать 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

8
задан emcee 24 May 2010 в 08:12
поделиться

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) не работает. Синтаксис оператора некорректен. Это не функция, которую можно вызвать.

12
ответ дан 5 December 2019 в 07:10
поделиться

Ограничение состоит в том, что del является оператором , а не выражением . Он не «возвращает значение», потому что в Python операторы не возвращают значения.

Форма лямбда позволяет упоминать только выражения (поскольку перед выражением есть неявный return ), а форма def допускает использование одного оператора функция должна быть указана в одной строке (как вы сделали с rmThis ).

Обычно del используется без круглых скобок, как:

del x

Однако включение круглых скобок вокруг аргумента как del (x) разрешено, но не означает, что это вызов функции. .

11
ответ дан 5 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: