ede*_*ans 1 python tuples list python-2.7
我想创建一个对象来存储游戏中某些生物的位置.
一组元组列表似乎对我来说是合适的.由列表列表创建的矩阵表示游戏的板,其元素是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)]]
Run Code Online (Sandbox Code Playgroud)
然后我想把一些人放在我的董事会中:
>>> board[2][2]=('h',3)
Run Code Online (Sandbox Code Playgroud)
我希望董事会是:
[[(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)]]
Run Code Online (Sandbox Code Playgroud)
但相反,当我这样做时>>> 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)]]
Run Code Online (Sandbox Code Playgroud)
我不明白为什么所有元素board都被修改,这是非常令人沮丧的.我肯定在这里遗漏了一些东西,谢谢你的帮助.
下列:
board = [[(0,0)]*lines]*columns
Run Code Online (Sandbox Code Playgroud)
应该成为
board = [[(0,0)]*lines for _ in range(columns)]
Run Code Online (Sandbox Code Playgroud)
否则,顶级列表包含对同一子列表的引用:
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]
Run Code Online (Sandbox Code Playgroud)
在此设置中,当您更改一个子列表时,它们都会更改.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |