Skip to main content
 首页 » 编程设计

python之"Pop index out of range"用于纸牌

2025年05月04日16webabcd

我目前拥有的是构建一副纸牌、洗牌以及从该副牌构建一手牌的代码。

from random import randint 
 
def make_deck(): 
    deck = [] 
    for suit in suits: 
        for rank in ranks: 
           deck.append((suit,rank)) 
    return deck 
 
suits = ['spades','hearts','diamonds','clubs'] 
ranks = ['ace','two','three','four','five','six','seven','eight','nine','ten','jack','queen','king'] 
 
deck = make_deck() #list of cards 
 
def shuffle(deck): 
    for k in range(100): # do it 100 times 
        card = deck.pop(randint(0,51)) 
        deck.append(card) 
 
def make_hand(): 
    hand = [] 
    for k in range(2): 
        card = deck.pop(randint(0,51)) 
        hand.append(card) 
    return hand 
 
hand = make_hand() 

当我运行该程序时,打印 deck 会给出我喜欢的纸牌列表,然后当我尝试洗牌时,我收到一条错误消息,指出 pop 索引已超出范围。不太确定为什么它会超出索引,因为范围 (0,51) 代表一副牌中的所有 52 张牌。

当我尝试使用 make_hand() 函数时,同样的错误出现了,尽管并非总是如此。我是否错误地使用了 pop 方法?我必须更改什么才能使 shuffle 功能起作用,并且 hand 总是从一副牌中返回两张不同的牌?

请您参考如下方法:

pop 通过从列表中删除项目来改变列表。因此,列表的长度将变得小于 52 并且最终会抛出一个错误。每次 len(deck) 时都使用列表的长度,而不是 51。

对于随机播放,您还可以使用库 random 中的函数 shuffle:

from random import shuffle 
## later in the code  
shuffle(deck)