使用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() # 新增这行,查看洗牌后的卡牌顺序
关键调整说明
- 移除
build方法内的打印逻辑,避免提前输出初始卡牌顺序造成混淆; - 修改
Card.show()为返回字符串,让Deck.show()统一处理打印,避免重复输出; - 最后新增
deck.show()调用,这样就能看到洗牌后的实际卡牌顺序了; - 其实
random.shuffle()是原地修改列表的,你的原shuffle方法返回self.cards是多余的,不过不影响功能,我这里做了简化。
现在运行代码,就能看到完全打乱顺序的卡牌组啦!
内容的提问来源于stack exchange,提问作者Kentta
相关产品推荐
相关产品推荐

