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

Python Blackjack游戏触发IndexError: list index out of range错误求助

问题分析与解决

你的代码触发IndexError的原因是**Deck.deal()方法只返回了一张牌**,导致hand.cards列表仅有一个元素,无法通过索引1访问第二张牌。

错误根源

在Deck类的deal方法中,return cards_dealt语句被放在了for循环内部,这意味着循环仅执行一次(处理第一张牌)就直接返回结果,不会继续处理第二张牌:

def deal(self, number):
    cards_dealt = []
    for x in range(number):
        if len(self.cards) > 0:
            card = self.cards.pop()              
            cards_dealt.append(card)        
        return cards_dealt  # 循环内返回,仅能拿到第一张牌

修正后的代码

将return语句移到for循环外部,确保循环能完整执行number次:

import random

class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
    def __str__(self):
        return f"{self.rank['rank']} of {self.suit}"    

class Deck:
    def __init__(self):
        self.cards = []
        suits = ["spades", "clubs", "hearts", "diamonds"]
        ranks = [                                           
                {"rank": "A", "value": 11},
                {"rank": "2", "value": 2},
                {"rank": "3", "value": 3},
                {"rank": "4", "value": 4},
                {"rank": "5", "value": 5},
                {"rank": "6", "value": 6},
                {"rank": "7", "value": 7},
                {"rank": "8", "value": 8},
                {"rank": "9", "value": 9},
                {"rank": "10", "value": 10},
                {"rank": "J", "value": 10},
                {"rank": "Q", "value": 10},
                {"rank": "K", "value": 10},
            ]
                

        for suit in suits:                  
            for rank in ranks:
                self.cards.append(Card(suit, rank))  

    def shuffle(self):   
        if len(self.cards) > 1:
            random.shuffle(self.cards)          
    def deal(self, number):
        cards_dealt = []
        for x in range(number):
            if len(self.cards) > 0:
                card = self.cards.pop()              
                cards_dealt.append(card)        
        return cards_dealt  # 移到循环外部,确保返回指定数量的牌              


class Hand:
    def __init__(self, dealer = False):
        self.cards = []
        self.value = 0
        self.dealer = dealer
    
    def add_card(self, card_list):
        self.cards.extend(card_list)

deck = Deck()
deck.shuffle()

hand = Hand()
hand.add_card(deck.deal(2))
print(hand.cards[1])

额外建议

为避免类似索引错误,建议在访问列表元素前先检查长度:

if len(hand.cards) >= 2:
    print(hand.cards[1])
else:
    print("手牌不足两张")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:23:26