尝试在while循环中重新定义变量时,无法调用NoneType对象

时间:2018-11-03 02:19:10

标签: python

我是Python的新手,所以也许这是一个基本问题。我正在写一个基本的2人二十一点游戏。因此,想法是在开始时生成一副纸牌,玩游戏,如果用户想再次玩,则重新开始while循环。我构建了一个函数来生成和洗牌,像这样:

import random

def deck():
    suites = ["Hearts","Diamonds","Clubs","Spades"]
    names = [2,3,4,5,6,7,8,9,10,"J","Q","K","A"]
    deck = []
    for suite in suites:
        for name in names:
            deck.append((name,suite))
    return random.sample(deck,len(deck))

然后在游戏开始时,我会调用一会儿True循环,玩游戏,然后询问用户是否要再次玩,就像这样:

while True:
        deck = deck()
# codes to play game here
userinput = input("Play again?")
    while not userinput.replace(" ", "") in ["yes","no"]:
        userinput = input("Play again?")    
    if userinput.replace(" ", "") == "no":
        break
    else:
            deck = None
            dealer_hand = None
            player_hand = None
            continue

我知道在Python中为变量分配None是一种将其用作占位符的方法,就像什么都没有一样,因此,当用户选择“是”并执行继续语句时,变量“ deck”将被分配给我先前定义的函数deck()的返回值,但是当我尝试这样做时,Python抛出NoneType是不可调用的。我来自VBA,当循环再次开始时,通常所有分配的变量都将采用新值而不会出现问题,因此这对我来说很难理解。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

  

变量“ deck”将被分配给我先前定义的函数deck()的返回值

是的,就是这个问题。 deck = deck()第一次执行后,该功能eck()将不再可在该范围内访问。您已覆盖其名称。 Python无法推断出deck()的意思是“用名称存储卡找到一个函数,然后调用它”。它将很乐意尝试调用您提供给它的任何对象,包括那些没有意义的对象,例如deck()返回的列表,或您在{{中分配给deck的None对象1}}块。

尝试为变量和函数使用不同的名称。我喜欢给函数名称加上动词。 else怎么样?