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
相关产品推荐
相关产品推荐

