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

Python卡牌游戏:调用display_hand函数时卡牌值无法显示

问题分析与修复方案

你的代码里有两个核心问题,导致display_hand函数无法正常展示卡牌内容:

1. deal_hand函数错误地存储了无效值到手牌列表

Card类的deal()方法仅修改实例内部的__value属性,没有返回值(默认返回None)。你执行hands = deal_hand.deal()时,hands拿到的是None,之后把None添加到hand列表里——这就导致display_hand拿到的是一个全是None的列表,自然打印不出有效内容。

另外你还犯了变量名冲突的问题:函数名是deal_hand,但你又用deal_hand = classcard3.Card()把这个名字赋值给了Card实例,虽然暂时没报错,但会导致后续无法再调用deal_hand()函数,非常不规范。

2. display_hand函数循环打印逻辑错误

在display_hand的循环里,你写的是print(hand),这会每次都打印整个手牌列表,而不是当前循环的单张卡牌。正确的写法应该是打印循环变量item。


修正后的完整代码

修正后的deal_hand函数

def deal_hand():
    # 创建空列表存储手牌
    hand = []
    # 更换变量名,避免和函数名冲突
    # 注意:如果要每张牌都是独立实例,要把创建实例的代码放到循环内
    for i in range(5):
        # 每次循环新建一个Card实例,保证每张牌独立
        card = classcard3.Card()
        # 调用deal()生成随机牌值
        card.deal()
        # 调试用打印(可选保留)
        print('deal', card)
        # 将Card实例本身添加到列表,而非deal()的返回值
        hand.append(card)
    return hand

修正后的display_hand函数

def display_hand(hand):
    print("The 5-card hand is: ")
    for item in hand:
        # 打印当前循环的单张卡牌,而非整个列表
        print(item)

关键补充说明

  • 一定要在循环内新建Card实例:如果复用同一个实例,列表里的所有元素会指向同一个对象,最终所有牌都会变成最后一次deal()生成的值。
  • Card类的__str__方法已经正确实现了牌面名称的转换,所以直接打印Card实例就能输出对应的牌名(比如Ace、Queen等)。

内容的提问来源于stack exchange,提问作者SpaceCadet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:04:29