Python中如何在类的__init__方法内打乱对象中的卡牌列表?
解决二十一点牌组打乱的问题
嘿,我来帮你搞定这个面向对象版二十一点里的牌组问题!完全可以在Cards类的__init__方法里实现牌组的创建和打乱,不需要在外部操作——你的问题主要出在对random.shuffle()的用法理解上,我来拆解一下:
问题根源
random.shuffle()是原地修改,返回None:这个函数会直接打乱传入的列表,但它不会返回新的打乱后的列表,而是返回None。所以你直接把它赋值给self.inPack的话,self.inPack就变成None了,根本存不下牌组。- 临时列表没被保存:
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
相关产品推荐
相关产品推荐

