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

Python二十一点游戏中newDeck.pop(0)触发AttributeError的原因

AttributeError: 'NoneType' object has no attribute 'pop'(二十一点游戏抽卡报错解决)

错误原因

你的代码中这一行是问题根源:

newDeck = shuffle(deck)

Python的random.shuffle()函数是原地修改传入的列表,不会返回新的列表对象,它的返回值固定为None。因此newDeck被赋值为None,后续调用newDeck.pop(0)时,自然会触发AttributeError——NoneType没有pop方法。

修复方案

有两种简单的修复方式:

方式1:直接使用原列表(原地打乱)

如果不需要保留原未打乱的牌组,直接对deck执行打乱操作,之后用deck替代所有newDeck的位置:

from random import shuffle

deck = ["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♦", "2♦", "3♦", "4♦", "5♦", "6♦", "7♦", "8♦", "9♦", "10♦", "J♦", "Q♦", "K♦"]

shuffle(deck) # 原地打乱,无需赋值

playerList = []
playerSum = 0
# ... 后续所有newDeck.pop(0)替换为deck.pop(0)

方式2:复制原列表后打乱(保留原牌组)

如果需要保留未打乱的原始deck,先复制一份再打乱:

from random import shuffle

deck = ["A♠", "2♠", ...] # 完整牌组
newDeck = deck.copy() # 复制原列表
shuffle(newDeck) # 打乱复制后的列表

# 后续正常使用newDeck.pop(0)即可

补充说明

Python中很多列表操作函数是原地执行的,比如list.sort()也是原地排序并返回None,与之对应的是返回新对象的函数(如sorted())。使用这类函数时,不要试图将返回值赋值给变量,直接操作原对象或先复制再操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:20:44