【问题标题】:Change values of a list of list (of tuples) in a for statement在 for 语句中更改列表(元组)列表的值
【发布时间】:2013-01-26 12:17:13
【问题描述】:

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

元组列表列表对我来说似乎很合适。由列表列表创建的矩阵表示游戏的棋盘,它的元素是 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的所有元素都被修改了,这非常非常令人沮丧。我肯定在这里遗漏了一些东西,感谢您的帮助。

【问题讨论】:

    标签: python list python-2.7 tuples


    【解决方案1】:

    以下内容:

    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]
    

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

    【讨论】:

    • 哇,真快!谢谢!
    猜你喜欢
    • 2021-08-11
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2022-06-30
    • 2021-08-24
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多