如何解决如何从类方法中更新字典?
我正在尝试编写一些基本的类和交互方法进行练习,并最终使其成为可以正常工作的游戏(类似于OGame)。在我的代码中,每个玩家都有一些自己的钥匙(我希望它们是类而不是字典,但也不能使它们起作用)。我希望字典通过使用 build_ships()函数来更新船只的数量及其类型,这样做似乎是正确的方法,但是目前无法正常工作...
免责声明:我通常在编码方面还很陌生,但是找不到任何可以很好地扩展的好的解决方案,或者找不到像这样的最佳结构是什么。
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)
解决方法
您不能将字典用作另一个字典的键,因为字典是可变的,并且字典键必须是可哈希的(不可变的)。
在我看来,self.ships
成为船只清单而不是字典更有意义。然后,您的build_ships
方法只需要将飞船追加到该列表即可。
考虑以下代码:
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
的原始字典的副本。否则,您将一遍又一遍地添加 same 词典,对self.ships
中的任何词典所做的任何修改都会反映在其他词典上。
字典中的键必须是可哈希的。因此,您不能将字典作为第二个字典的键。 一种方法是,如果您知道飞船的名称是唯一的,那么您可以只使用Player对象来维护名称和数量。
def build_ships(self,quantity):
self.ships[ship] = quantity
将由以下人员呼叫
:player_1.build_ships("SMALL CRUISER",5)
然后您可以拥有一个单独的词典来维护船只的类型,例如:
ships = {"SMALL CRUISER":{"size":5,"speed":30},"BIG CRUISER":{"size":7,"speed":25},}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。