You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:15:07