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

Python中如何在类的__init__方法内打乱对象中的卡牌列表?

解决二十一点牌组打乱的问题

嘿,我来帮你搞定这个面向对象版二十一点里的牌组问题!完全可以在Cards类的__init__方法里实现牌组的创建和打乱,不需要在外部操作——你的问题主要出在对random.shuffle()的用法理解上,我来拆解一下:

问题根源

  1. random.shuffle()是原地修改,返回None:这个函数会直接打乱传入的列表,但它不会返回新的打乱后的列表,而是返回None。所以你直接把它赋值给self.inPack的话,self.inPack就变成None了,根本存不下牌组。
  2. 临时列表没被保存:self.cards * self.number_of_packs确实会生成包含多副牌的新列表,但你只是把这个临时生成的列表传给了shuffle,却没先把它存下来,打乱后的结果自然就丢了。

修正后的代码

下面是调整后的Cards类实现,完美在__init__里完成多副牌的生成和打乱:

import random  # 建议把导入放在文件顶部,符合Python编码规范

class Cards:
    def __init__(self):
        self.onTable = []
        # 完整的单副牌示例列表
        self.cards = ["2 ♥", "3 ♥", "4 ♥", "5 ♥", "6 ♥", "7 ♥", "8 ♥", "9 ♥", "10 ♥", "J ♥", "Q ♥", "K ♥", "A ♥",
                      "2 ♦", "3 ♦", "4 ♦", "5 ♦", "6 ♦", "7 ♦", "8 ♦", "9 ♦", "10 ♦", "J ♦", "Q ♦", "K ♦", "A ♦",
                      "2 ♣", "3 ♣", "4 ♣", "5 ♣", "6 ♣", "7 ♣", "8 ♣", "9 ♣", "10 ♣", "J ♣", "Q ♣", "K ♣", "A ♣",
                      "2 ♠", "3 ♠", "4 ♠", "5 ♠", "6 ♠", "7 ♠", "8 ♠", "9 ♠", "10 ♠", "J ♠", "Q ♠", "K ♠", "A ♠"]
        self.number_of_packs = random.randint(2, 5)
        
        # 1. 先生成包含指定副数的完整牌组
        full_deck = self.cards * self.number_of_packs
        # 2. 原地打乱这个牌组
        random.shuffle(full_deck)
        # 3. 把打乱后的牌组赋值给实例变量
        self.inPack = full_deck

额外小提示

  • 把import random放在文件顶部而不是__init__方法里,这样不用每次创建Cards对象都重复执行导入操作,更高效也更规范。
  • 如果后续需要重新洗牌,你可以在Cards类里加一个shuffle_deck()方法,逻辑和__init__里的洗牌步骤差不多,方便复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:42:30