为什么使用List而不是Tuple来代表游戏板?

时间:2016-02-03 06:09:42

标签: python arrays tuples

Tetris game in the PyGame book中,他们使用以下方式创建了一个电路板:

 board = []
 for i in range(BOARDWIDTH):
    board.append([BLANK] * BOARDHEIGHT)
 return board

虽然这很好,列表列表,我正在考虑它们通常如何用Java和其他语言表示,作为具有集索引的数组 - 例如,int board[][] = new int[8][8]; // create 64 integers(a {{ 3}})。

据我所知,元组更类似于数组(vs List更像是ArrayList或Java的LinkedList)。他们设置了多个元素,无法添加,并保留一定数量的项目。

为什么我们不为棋盘创建一个元组元组,例如

board = ( (BLANK,)*10 ,)*10

他们是否使用列表列表在Python的内部表示中进行某些优化,或者仅仅是因为他们假设用户比Tuple更常见地知道List?

这具有功能和制作不可变对象的额外好处。例如,如果你想制作一个你在tic tac toe中移动的状态的板子,你可以尝试类似的东西:

tictac = ((0,0,0),)*3
vals = (tuple((tictac[r][c]) if r!=1 or c!=1 else 'x' for (r,row) in enumerate(tictac)) for c in range(3))
for i in vals: print i

将1移动到中心。

列表推导在Python中非常灵活,这在功能上更正确。

1 个答案:

答案 0 :(得分:1)

python中list和tuple之间的区别在于元组是不可变的。这就是为什么你不能改变一个元组的大小(因为你根本无法改变它)。

因此,在这种情况下通常会选择列表的原因是您通常想要更改游戏板的内容。

具有固定尺寸矩阵的好处可能很小。当然可以说人们可能会获得一些性能优势,但AFAIK内置类型无论如何都是动态大小,因为大小是在运行时和每次访问容器时确定的。在这方面,listtuple没有区别,就是当你写board[3][4]时,python首先访问board检查它的长度是否大于{ {1}}因此它可以传递3元素,然后该元素恰好是[3] / list,然后检查它的大小,使其大于{{} {1}}因此它可以传递tuple元素。

人们还可以争辩说,这是出于安全原因,还是出于良好做法和#34;不允许董事会调整大小,我可以就此达成一致。那么允许修改的是将它包装在一个不允许调整大小的类中。但是应该记住,python并没有提供非常严格的类保护,禁止你摆弄内部 - 而python信任程序员不要做丑陋的事情,而不是试图禁止。