Python中Player类cards列表共享问题:append操作影响所有玩家
Blackjack多玩家发牌异常:所有玩家手牌同步更新的问题
我正在开发一款支持多玩家的Blackjack游戏,通过存储Player对象的列表管理多玩家,每个Player对象用cards列表存储手牌。执行players[2].cards.append(drawCard())为最后一位玩家发牌时,发现牌被添加到了所有玩家的cards列表中。
代码
import random players: list[object] = [] # 存储玩家对象的列表 def drawCard(): # 随机生成2-14的牌,转换为Blackjack规则对应的数值 card = random.randint(2,14) if (card >= 11) and (card <= 13): print("[DRAWCARD] - Facecard") card = 10 elif card == 14: print("[DRAWCARD] - Ace") card = 11 return card class Player: # 玩家类,包含手牌列表 cards: list[int] = [] for i in range(3): # 创建3个玩家对象存入列表 players.append(Player()) players[2].cards.append(drawCard()) # 为最后一位玩家发牌 for player in players: # 打印所有玩家的手牌和对象地址 print(player.cards) print(player)
运行输出
[5] <__main__.Player object at 0x00000140AEB5A3F0> [5] <__main__.Player object at 0x00000140AEB5A330> [5] <__main__.Player object at 0x00000140AEB5BDA0>
问题原因
你在Player类中把cards定义成了类属性,类属性属于整个类,所有Player实例会共享同一个cards列表。因此修改任意一个实例的cards,所有实例的cards都会同步变化。
解决方案
将cards改为实例属性,在类的__init__方法中初始化,让每个Player实例拥有独立的手牌列表:
class Player: def __init__(self): self.cards: list[int] = []
修改后,每个玩家对象会创建自己专属的cards列表,此时执行players[2].cards.append(drawCard())只会更新最后一位玩家的手牌,其他玩家的cards列表不会受到影响。
内容的提问来源于stack exchange,提问作者FerbSilent
相关产品推荐
相关产品推荐

