PyCharm中运行面向对象实现的扑克牌发牌代码偶发ValueError求原因
报错原因分析
- 随机抽样方法选择错误:你使用的
random.choices()属于有放回抽样,单次抽3张牌时可能抽到重复的相同牌。第一张重复牌调用remove()从牌堆移除后,第二张重复的牌已经不存在于牌堆中,就会触发ValueError: list.remove(x): x not in list报错。因为抽样结果是随机的,只有刚好没抽到重复牌时程序才会正常运行,这就是运行结果不稳定的核心原因。 - 不良编码习惯:你用列表推导式执行
remove()操作,仅利用推导式的副作用而丢弃返回值,属于不符合Python编码规范的写法,建议替换为普通for循环。
修复方案
将deal方法中的random.choices替换为无放回抽样的random.sample,该方法会保证抽取的k个元素互不重复,不会出现重复删除的问题。修复后代码如下:
import random import itertools class Deck: def __init__(self): self.card_list = self.build() def build(self): suit = ["S", "H", "D", "C"] val = ["ace", "two", "thr", "fou", "fiv", "six", "sev", "eig", "nin", "ten", "jac", "que", "kin"] return list(itertools.product(suit, val)) def deal(self): # random.sample为无放回抽样,保证抽取的牌不重复 cards = random.sample(population=self.card_list, k=3) # 替换列表推导式为普通for循环 for card in cards: self.card_list.remove(card) return cards
内容的提问来源于stack exchange,提问作者sean harricharan
相关产品推荐
相关产品推荐

