首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从类方法中更新字典?

如何从类方法中更新字典?
EN

Stack Overflow用户
提问于 2020-08-14 20:04:01
回答 2查看 64关注 0票数 0

我正在尝试编写一些基本的类和交互来进行实践,并最终将其变成一个工作游戏(类似于OGame)。在我的代码中,每个玩家都有一些工具(我更希望它们是类,而不是数据集,但也无法让它们工作)使用自己的密钥。我希望字典通过使用build_ships()函数来更新船只的数量和类型,这样做感觉是正确的方法,但它目前无法工作.

免责声明:总的来说,我在编码方面很新,但找不到任何好的解决方案,这些解决方案可以很好地扩展,也不能找到这样的最佳结构。

代码语言:javascript
复制
class Player:
    def __init__(self, name, ships=None):
        self.name = name
        if ships is None:
            self.ships = {}
        else:
            self.ships = ships

    def build_ships(self, ship, quantity):
        self.ships[ship] = quantity


small_cruiser = {
"name":'SMALL CRUISER',
"size":5,
"attack":10,
"defense":7,
"speed":30
}

big_cruiser = {
"name":'BIG CRUISER',
"size":7,
"attack":15,
"defense":9,
"speed":25
}

player_1 = Player('TheLegend27')
player_1.build_ships(small_cruiser, 5)
EN

回答 2

Stack Overflow用户

发布于 2020-08-14 20:18:12

您不能在另一个字典中使用字典作为键,因为字典是可变的,而字典键必须是可选的(不可变)。

在我看来,self.ships是一张船只列表,而不是一本字典更有意义。然后,您的build_ships方法只需附加到该列表中。

考虑以下代码:

代码语言:javascript
复制
class Player:
    def __init__(self, name, ships=None):
        self.name = name
        if ships is None:
            self.ships = []
        else:
            self.ships = ships

    def build_ships(self, ship, quantity):
        for _ in range(quantity):
            s = ship.copy()
            self.ships.append(s)


small_cruiser = {
    "name":'SMALL CRUISER',
    "size":5,
    "attack":10,
    "defense":7,
    "speed":30
}

big_cruiser = {
    "name":'BIG CRUISER',
    "size":7,
    "attack":15,
    "defense":9,
    "speed":25
}

player_1 = Player('TheLegend27')
player_1.build_ships(small_cruiser, 5)

注意,我们需要添加行s = ship.copy(),以便创建作为参数传入build_ships的原始字典的副本。否则,您将一次又一次地追加相同的字典,而对self.ships中的任何字典所做的任何修改都会反映到其他字典上。

票数 2
EN

Stack Overflow用户

发布于 2020-08-14 20:19:12

字典里的钥匙必须是可说的。因此,您不能在第二个字典中将字典作为密钥。一种方法是,如果您知道船舶的名称是唯一的,那么您就可以让Player对象只维护名称和计数。

代码语言:javascript
复制
def build_ships(self, ship, quantity):
        self.ships[ship] = quantity

它将由下列组织调用:

代码语言:javascript
复制
player_1.build_ships("SMALL CRUISER", 5)

然后,您可以有一个单独的字典来维护船舶的类型,比如:

代码语言:javascript
复制
ships = {"SMALL CRUISER":{"size":5,
                          "attack":10,
                          "defense":7,
                          "speed":30},
         "BIG CRUISER":{"size":7,
                        "attack":15,
                        "defense":9,
                        "speed":25},
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63419362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档