Skip to main content
 首页 » 编程设计

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

2025年05月04日15落叶

例如,我想打印出一个最初为 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) 

?

请您参考如下方法:

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

然而,考虑到 Python 3 中 print 函数本身所拥有的所有功能,使用 map 只是在单独的行上打印 iterable 的所有项目是不够优雅的:

>>> 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 循环:

for row in board: print row

  1. 从 __future__ 模块导入 Python 3 的打印函数:

from __future__ import print_function