当我在迭代器上调用list()时,Python 3中发生了什么?

时间:2015-04-23 04:27:11

标签: python python-3.x

例如,我想打印一个最初为tic tac toe的板子

board = [[0]*3]*3

我想使用map将print()应用于每一行,以便输出

[0, 0, 0]
[0, 0, 0]
[0, 0, 0]

在Python 3中,map返回一个迭代器而不是一个列表,所以我找到的一个适应这个的例子是

list(map(print, board))

这给出了正确的输出。但我不知道这里发生了什么 - 有人可以解释你做什么事情

list(iterator)

2 个答案:

答案 0 :(得分:4)

内置的list构造函数是强制迭代器和生成器在Python中完全迭代的常用方法。当您调用map时,它只返回一个map对象,而不是实际评估映射,这是代码片段作者所不希望的。

然而,当您考虑打印函数本身在Python 3中保存的所有功能时,仅使用map打印单独行上的迭代的所有项目是不优雅的:

>>> board = [[0]*3]*3
>>> board[0] is board[1]
True
>>> "Uh oh, we don't want that!"
"Uh oh, we don't want that!"
>>> board = [[0]*3 for _ in range(3)]
>>> board[0] is board[1]
False
>>> "That's a lot better!"
"That's a lot better!"
>>> print(*board, sep='\n')
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]

附加说明:在Python 2中,print被视为一种陈述,并且功能不强,你仍然至少有两个更好的选择而不是使用map

  1. 使用旧的for-loop:
  2. for row in board: print row

    1. __future__模块导入Python 3的打印功能:
    2. from __future__ import print_function

答案 1 :(得分:2)

OrmAdapter

当你在一个iterable上调用>>> list(map(print, board)) [0, 0, 0] [0, 0, 0] [0, 0, 0] [None, None, None] 时,它会从iterable中提取每个元素。在这种情况下,其副作用是打印三行。但list操作的结果是print。因此,对于执行的每个None,将print添加到列表中。上面的最后一行由三个Nones组成,是None返回的实际列表。