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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:36:03