【问题标题】:Incrementing list values递增列表值
【发布时间】:2015-11-15 22:34:44
【问题描述】:

我正在复制一个播放器模板,设置一个字段,然后将更新的模板附加到一个新列表中。

player_template = {
    "player": "",
    "hand": [
        {0 :
            {
                "cards_in_hand": [],
                "cards_taken": []
            }
        }
    ]
}

但是,当我进行范围循环以创建多个玩家时,它只会多次创建最后一个玩家。

for i in range(4):
        p["player"] = i
        players.append(p)

输出:

[
    {
        'player': 3,
        'hand': [
            {
                0: {
                    'cards_in_hand': [],
                    'cards_taken': []
                }
            }
        ]
    },
    {
        'player': 3,
        'hand': [
            {
                0: {
                    'cards_in_hand': [],
                    'cards_taken': []
                }
            }
        ]
    },
    {
        'player': 3,
        'hand': [
            {
                0: {
                    'cards_in_hand': [],
                    'cards_taken': []
                }
            }
        ]
    },
    {
        'player': 3,
        'hand': [
            {
                0: {
                    'cards_in_hand': [],
                    'cards_taken': []
                }
            }
        ]
    }
]

我试过range(start, stop, step),但它也产生了相同的结果。如何让输出成为玩家 1、玩家 2 等?

【问题讨论】:

    标签: list loops python-3.x


    【解决方案1】:

    目前,您每次迭代都会覆盖前一个播放器。这是因为字典是 mutable 对象,而您指向的是同一个对象。

    你需要deep-copy代表玩家的映射:

    import copy
    
    for i in range(4):
        p["player"] = i
        players.append(copy.deepcopy(p))
    

    我使用过copy.deepcopy,但如果需要,您可以手动执行此操作。

    更好的方法是使用实​​际的类来表示Player

    【讨论】:

    • 啊,有道理。是的,既然你提到了它,那么一堂课是解决这个问题的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2011-01-18
    • 2020-04-28
    • 2018-04-22
    • 2022-01-18
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多