更改for语句中列表(元组列表)的值

时间:2013-01-26 12:17:14

标签: python list python-2.7 tuples

我想创建一个对象来存储游戏中某些生物的位置。

一组元组列表似乎对我来说很合适。由列表列表创建的矩阵表示游戏的板,其元素是2个变量的元组('类型',数字)。例如:('h',3)意味着:'这里有3个人'。

以下是我如何初始化电路板:

>>>lines = 5
>>>columns = 5
>>>board= [[(0,0)]*lines]*columns
>>>pprint(board)
[[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)]]

然后我想把一些人放在我的董事会中:

>>> board[2][2]=('h',3)

我希望董事会成为:

[[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), ('h', 3), (0, 0), (0, 0)],
[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), (0, 0), (0, 0), (0, 0)]]

但相反,当我执行>>> pprint(board)时,它会返回:

[[(0, 0), (0, 0), ('h', 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), ('h', 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), ('h', 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), ('h', 0), (0, 0), (0, 0)],
[(0, 0), (0, 0), ('h', 0), (0, 0), (0, 0)]]

我不明白为什么board的所有元素都被修改了,这非常令人沮丧。我肯定在这里遗漏了一些东西,谢谢你的帮助。

1 个答案:

答案 0 :(得分:5)

以下内容:

board = [[(0,0)]*lines]*columns

应该成为

board = [[(0,0)]*lines for _ in range(columns)]

否则,顶级列表包含到同一子列表的引用

In [7]: lines = 3

In [8]: columns = 4

In [9]: board = [[(0,0)]*lines]*columns

In [10]: map(id, board)
Out[10]: [18422120, 18422120, 18422120, 18422120]

在此设置中,当您更改一个子列表时,它们都会更改。