Страницы

Поиск по вопросам

четверг, 30 мая 2019 г.

Python. Как работает генератор списка с lambda

Написал вот такую строчку:
a = [lambda x : x^n for n in range(10)]
При этом на каждой итерации
for i in range(10): print(a[i](2))
выдает 11, a
for i in range(10): print(a[2](i))
выдет: 9 8 11 10 13 12 15 14 1 0
Почему?


Ответ

Если я правильно понял, то происходит следующее:
a = [lambda x : x^n for n in range(10)] - тут создается список функций. Это то же самое, что и:
def xoring(x): for n in range(10): pass return x^n
a = [] for i in range(10): a.append(xoring)
Можно даже посмотреть что внутри списка и увидеть набор функций:
>>> a [. at 0x029E1468>, . at 0x02B7C300>, . at 0x02B7C348>, . at 0x02B7C390>, . at 0x02B7C3D8>, . at 0x02B7C420>, . at 0x02B7C468>, . at 0x02B7C4B0>, . at 0x02B7C4F8>, . at 0x02B7C540>]
Далее, for i in range(10): print(a[i](2)), 10 раз вызывается i-я функция из списка a и ей передается аргумент 2. Так как функции одинаковые, то и результаты одинаковые. Т.е. внутри происходит следующее:
lambda x : x^n for n in range(10) - здесь i изменяется от 0 до 9 и ксорится с x. Т.к. x = 2, то x^i даст такие результаты:
2^ 0 = 2 2^ 1 = 3 2^ 2 = 0 2^ 3 = 1 2^ 4 = 6 2^ 5 = 7 2^ 6 = 4 2^ 7 = 5 2^ 8 = 10 2^ 9 = 11
Последнее значения и возвращает функция.
Здесь for i in range(10): print(a[2](i)) 10 раз вызывается функция с индексом 2 в списке a и ей передается значение i, которое меняется от 0 до 9. То же самое, что и
for i in range(10): print(xoring(i))
Что в результате и дает
0 ^ 9 = 9 1 ^ 9 = 8 2 ^ 9 = 11 3 ^ 9 = 10 4 ^ 9 = 13 5 ^ 9 = 12 6 ^ 9 = 15 7 ^ 9 = 14 8 ^ 9 = 1 9 ^ 9 = 0

Комментариев нет:

Отправить комментарий