Python中Player类多实例被setField覆盖问题咨询
问题分析与解决:Player实例共享类属性导致的覆盖问题
嘿,我一眼就找到你问题的根源了——你的Player类里的hand、field是类属性,而不是每个实例独有的属性!这就意味着所有Player对象都会共用同一个hand和field列表,所以你调用setField修改其中一个实例的字段时,其他实例的字段也会跟着变,因为它们指向的是同一个列表。
为什么会这样?
在Python中,如果你在类定义的顶层直接给变量赋值(比如hand = [None]*10),这个变量属于类本身,是所有实例共享的资源。只有在__init__方法里通过self.xxx创建的属性,才是每个实例独立拥有的。
修正后的代码
把类属性移到__init__方法里,让每个实例拥有自己的hand和field列表:
class Player: def __init__(self, deck): # 将hand、field改为实例属性,每个Player对象独立拥有 self.hand = [None]*10 self.field = [None]*10 self.deck = deck def setHand(self, hand): for i in range(len(hand)): self.hand[i] = hand[i] def setField(self, field): for i in range(len(field)): self.field[i] = field[i] # 补充你原代码中缺失的Card类示例(可根据实际需求调整) class Card: def __init__(self, value, suit): self.value = value self.suit = suit card1 = Card(1, 0) card2 = Card(2, 0) card3 = Card(3, 0) h = [card1, card2, card3] f = [card1, card2, card3] f2 = [card1, card2] cpu1 = Player(f2) cpu1.setField(f2) user1 = Player(h) user1.setHand(h) user1.setField(f2)
效果说明
修改后,每个Player实例都会维护自己独立的hand和field列表。调用setField或setHand时,只会修改当前实例对应的列表,再也不会出现一个实例修改导致其他实例被覆盖的问题了。
内容的提问来源于stack exchange,提问作者Jonathon J
相关产品推荐
相关产品推荐

