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

使用random.shuffle实现卡牌洗牌功能无效问题求助

问题排查与解决

嘿,我找到问题啦!你其实已经成功完成洗牌了,只是没有查看洗牌后的结果而已~

问题根源分析

你的代码里,Deck类的build方法在创建每张卡牌时就直接打印了初始顺序,而你调用deck.shuffle()之后,并没有调用deck.show()来输出洗牌后的卡牌组。所以你看到的始终是build阶段打印的初始卡牌顺序,误以为洗牌逻辑没生效。

另外还有个小细节:Card.show()方法里既打印内容又返回value,会导致后续Deck.show()调用时重复输出内容,也容易造成混淆。

修正后的代码

import random
class Card(object):
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value
    def show(self):
        # 改为返回字符串,让Deck统一控制打印逻辑
        return "{} of {}".format(self.value, self.suit)

class Deck(object):
    def __init__(self):
        self.cards = []
        self.build()
    def build(self):
        for s in ["Spades", "Clubs", "Diamonds", "Hearts"]:
            for v in range(1, 14):
                self.cards.append(Card(s, v))
        # 移除build里的打印,避免提前输出初始顺序干扰判断
    def show(self):
        for card in self.cards:
            print(card.show())
    def shuffle(self):
        # random.shuffle是原地修改列表,不需要返回值也能生效
        random.shuffle(self.cards)
    def draw_card(self):
        return self.cards.pop()

deck = Deck()
deck.shuffle()
deck.show()  # 新增这行,查看洗牌后的卡牌顺序

关键调整说明

  1. 移除build方法内的打印逻辑,避免提前输出初始卡牌顺序造成混淆;
  2. 修改Card.show()为返回字符串,让Deck.show()统一处理打印,避免重复输出;
  3. 最后新增deck.show()调用,这样就能看到洗牌后的实际卡牌顺序了;
  4. 其实random.shuffle()是原地修改列表的,你的原shuffle方法返回self.cards是多余的,不过不影响功能,我这里做了简化。

现在运行代码,就能看到完全打乱顺序的卡牌组啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:28:11