2015-04-23 61 views
1

例如,我想打印出井字一个板,其最初是当我在迭代器上调用list()时,Python 3中发生了什么?

board = [[0]*3]*3 

我想使用地图应用打印()到每一行,以使得输出是

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

在Python 3,地图返回一个迭代器而不是列表,以便适应这个的一个例子,我发现是

list(map(print, board)) 

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

list(iterator) 

+5

**不要这样做**使用循环。 'map'用于对数据进行转换,而不是引起副作用。 – user2357112

+5

另外,'[[0] * 3] * 3'是初始化该板的错误方法。该董事会中的所有子列表都是相同的列表;只要您尝试对其执行任何操作,例如'board [0] [0] = 1',它就会中断。使用list comprehension:'board = [[0] * 3 for i in xrange(3)]'' – user2357112

回答

2
>>> list(map(print, board)) 
[0, 0, 0] 
[0, 0, 0] 
[0, 0, 0] 
[None, None, None] 

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

4

内置的list构造函数是强制迭代器和生成器在Python中完全迭代的常用方法。当你调用map时,它只返回一个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 3保持功率

但是,使用map只打印在单独的行可迭代的所有项目不雅在Python 2,其中print被视为一个声明,而不是那么强大,你仍然至少两个比使用map更好的选择:

  1. 使用一个很好的旧for循环:

for row in board: print row

  • 导入Python从所述__future__模块3的打印功能:
  • from __future__ import print_function

    相关问题