Встроенный Python del () не может быть использован в назначении? - PullRequest
8 голосов
/ 24 мая 2010

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

Ответы [ 2 ]

12 голосов
/ 24 мая 2010

Две проблемы.Первый более тонкий, поэтому я объясню это в первую очередь.

Проблема в том, что 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, которая проще.Функции Python lambda могут содержать только выражения, но не операторы.del не в выражении (то есть, не в вызове функции) - это утверждение (del_stmt), и поэтому оно не может появляться в теле лямбды.Вы бы увидели ту же проблему, если бы попытались поместить print в тело лямбды.

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

Это также объясняет причину сбоя x=del(a).Синтаксис оператора недействителен.Это не функция, которая может быть вызвана.

11 голосов
/ 24 мая 2010

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

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

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

del x

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...