Почему функция карты Python 3 не вызывается при использовании deque? - PullRequest
0 голосов
/ 04 июля 2019

Функция аргумента map не вызывается, когда я использую deque в качестве входных данных для нее.

Если я просто зациклю и вызову функцию поворота, это сработает.

Почему res не вращается вообще после функции карты?

>>> print(res)
[deque([4, 5, 1, 2, 3]), deque([4, 5, 1, 2, 3]), deque([4, 5, 1, 2, 3]), deque([4, 5, 1, 2, 3]), deque([4, 5, 1, 2, 3])]
>>> map(lambda x: x.rotate(1), res)
<map object at 0x10a35b7f0>
>>> print(res)
[deque([4, 5, 1, 2, 3]), deque([4, 5, 1, 2, 3]), deque([4, 5, 1, 2, 3]), deque([4, 5, 1, 2, 3]), deque([4, 5, 1, 2, 3])]

Однако, если я использовал цикл, он поворачивается.

>>> for x in res:
...     x.rotate(1)
...
>>> print(res)
[deque([3, 4, 5, 1, 2]), deque([3, 4, 5, 1, 2]), deque([3, 4, 5, 1, 2]), deque([3, 4, 5, 1, 2]), deque([3, 4, 5, 1, 2])]
>>>

1 Ответ

0 голосов
/ 04 июля 2019

map (как выражение генератора) ленив. Он не выполняет итерацию списка и не оценивает его функцию до тех пор, пока вы его не принудите, и вы не заставляете итератор работать здесь.

Вы можете форсировать это, поместив его в список (или используя понимание с самого начала):

list(map(lambda x: x.rotate(1), res))

list принудительно оценивает возвращенное map.

В идеале, вы не должны использовать map для побочных эффектов. Цель map - преобразовать один список в другой. Просто используйте для этого полный цикл for.

...