Это не дубликат Assignment внутри лямбда-выражения в Python, т.е. Я не спрашиваю, как обмануть Python в назначении в выражении lambda
.
У меня есть некоторый фон -calculus. Учитывая следующий код, похоже, что Python вполне готов выполнять побочные эффекты в lambda
выражениях:
#!/usr/bin/python
def applyTo42(f):
return f(42)
def double(x):
return x * 2
class ContainsVal:
def __init__(self, v):
self.v = v
def store(self, v):
self.v = v
def main():
print('== functional, no side effects')
print('-- print the double of 42')
print(applyTo42(double))
print('-- print 1000 more than 42')
print(applyTo42(lambda x: x + 1000))
print('-- print c\ value instead of 42')
c = ContainsVal(23)
print(applyTo42(lambda x: c.v))
print('== not functional, side effects')
print('-- perform IO on 42')
applyTo42(lambda x: print(x))
print('-- set c\ value to 42')
print(c.v)
applyTo42(lambda x: c.store(x))
print(c.v)
#print('== illegal, but why?')
#print(applyTo42(lambda x: c.v = 99))
if __name__ == '__main__':
main()
Но если я раскомментирую строки
print('== illegal, but why?')
print(applyTo42(lambda x: c.v = 99))
Я получу
SyntaxError: lambda cannot contain assignment
Почему бы и нет? Что является более глубокой причиной этого?
-
Как показывает код, это не может быть о "чистоте" в функциональном смысле.
-
Единственное объяснение, которое я могу себе представить, заключается в том, что присваивания не возвращают ничего, даже
None
. Но это звучит слабо, и было бы легко исправить (один из способов: заставить лямбда-выражения возвращатьNone
если тело - это утверждение).
Не ответ:
-
Потому что он определил этот путь (я хочу знать, почему он определил этот путь).
-
Потому что это в грамматике (см. Выше).
-
Используйте
def
если вам нужны утверждения (я не спрашивал, как получить инструкции в функцию).
"Это изменило бы синтаксис/язык/семантика" было бы в порядке, если бы вы могли придумать пример такого изменения и почему это было бы плохо.