【问题标题】:How do I stop updating all object's dictionaries in a list of objects? (Python)如何停止更新对象列表中的所有对象字典? (Python)
【发布时间】:2017-10-24 17:47:59
【问题描述】:

对于一个学校项目,我正在尝试将棋盘游戏转换为 Python 游戏

我正在翻译的游戏是“股票行情”,它涉及买卖 6 只“股票”。可以玩的玩家数量为2-8。我制作可变玩家人数的方法是创建一个玩家类,并初始化一个玩家对象并在游戏开始时将其添加到列表中。

class player:
    money = 5000
    stocks = {'Gold': 0, 'Tech': 0, 'Oil': 0, 'Grain': 0, 'Industry': 0, 'Bonds': 0}

我用

创建列表
for i in range(0, playersTotal):
     newPlayer = player()
     playerList.append(newPlayer)

问题是当玩家买卖股票并调整价值时说:(假设玩家0有0金币)

playerList[0].stocks['Gold'] += 1000

每个玩家的每个字典都以相同的方式更新

print(playerList[1].stocks['Gold'])
>>>1000

我不知道为什么要为列表中的所有玩家对象更新字典,因为当金钱属性被调整时,它保持独立:(如果两个玩家都有 0 金钱)

playerList[0].money += 1000
print(playerList[1].money)
>>> 0

如何将字典分开?

【问题讨论】:

  • 您正在跨实例使用相同的字典。当您对字典进行变异时,将跨实例看到效果。
  • 你需要在__init__函数中定义变量。
  • @MauriceMeyer 虽然这是个好建议,但从根本上说,变量必须是实例变量,无论它们是在哪里定义的。

标签: python python-3.x dictionary


【解决方案1】:

那是因为你的stocks 是static,你应该把它作为instance 变量而不是static 变量,试试这个:

class player:    
    def __init__(self):
        self.money = 5000
        self.stocks = {'Gold': 0, 'Tech': 0, 'Oil': 0, 'Grain': 0, 'Industry': 0, 'Bonds': 0}

由于您的stocks 变量是static,所有实例都使用相同的stocks,因此当您从任何实例更新其值时,它将为所有实例更新,因为该变量是共享的所有的实例。

输出

>>> for i in range(0, 10):
...      newPlayer = player()
...      playerList.append(newPlayer)
... 
>>> playerList[0].stocks['Gold'] += 5000
>>> playerList[0].stocks['Gold'] 
5000
>>> playerList[1].stocks['Gold']
0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多