Написал вот такую строчку:
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
[
Далее, 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
Комментариев нет:
Отправить комментарий