繁体   English   中英

NameError: name 'playerNumber' is not defined - 尽管我在另一个 function 中定义了它

[英]NameError: name 'playerNumber' is not defined - even though i defined it in another function

我正在为项目编写贪吃蛇游戏,但出于某种原因,它说变量 playerNumber 未定义,即使我在之前的 function 中非常清楚地定义了它。我真的不知道出了什么问题,我尝试了各种方法,但没有任何帮助。

import turtle
gt = turtle.Turtle()
t1 = turtle.Turtle()
t2 = turtle.Turtle()
t3 = turtle.Turtle()
t4 = turtle.Turtle()
turtle.bgcolor("White")

def start():
    print ("Welcome to python Snake! A game made by Kippo and inspired by the famous game: Snake!")
    playerNumber = int(input("How many players are going to play? (2-4)"))
    if playerNumber >= 5:
        print("Too many players! Try again.")
        start()
    elif playerNumber <= 1:
        print("Too few players! Try again.")
        start()
    else:
        playerColour()
        
def playerColour():
    global playerNumber
    if playerNumber == 1:
        player1colour = input("player 1, what colour do you want to be?")
    elif playerno == 2:
        player1colour = input("player 1, what colour do you want to be?")
        player2colour = input("player 2, what colour do you want to be?")
    elif playerno == 3:
        player1colour = input("player 1, what colour do you want to be?")
        player2colour = input("player 2, what colour do you want to be?")
        player3colour = input("player 3, what colour do you want to be?")
    elif playerno == 4:
        player1colour = input("player 1, what colour do you want to be?")
        player2colour = input("player 2, what colour do you want to be?")
        player3colour = input("player 3, what colour do you want to be?")
        player4colour = input("player 4, what colour do you want to be?")
    else:
        print ("Too many players, try again.")
        quit()
        
def gridSize():
    gridsize = int(input("What size do you want your grid to be?"))
    gt.circle(2)
    


start()

我试过更改变量的名称,移动函数,并尝试使用变量的各种其他方法,但没有任何改变。

说说scope吧。

你写了这个:

def start():
    playerNumber = ...

def playerColour():
    global playerNumber
    if playerNumber == ...

也就是说,start() 进行赋值,而 playerColor() 希望读取该值。 但是正如所写的那样,它正在做一个本地start的任务。

start中放置一个global playerNumber声明,您将看到不同的行为。


scope

Python 在不同可见级别维护变量名称空间,包括“顶级”和“函数局部”,例如 start() 或 playerColour()。

对名称的引用将按顺序探测几个名称空间,在顶级全局变量之前匹配函数的局部变量。

function 中的赋值通常会创建一个局部变量,该变量在退出 function 时超出范围(被销毁)。

python 中常见的“陷阱”如下所示:

name = "Alice"

def set_name():
    name = "Bob"

set_name()
print(name)

问题:这将显示什么?

答案:爱丽丝。 为什么? 因为当我们设置名称时,我们创建了一个新的局部变量。 我们从未使用过它,当 function 退出时它被销毁了。

要获得预期的行为,请声明一个全局的:

def set_name():
    global name
    name = "Bob"

实际上,大多数代码更愿意将此类代码和数据封装在self.name中,而不是分配给 self.name。 但这是另一天的话题。


全局变量

您刚刚开始编程,我对此表示赞赏,go,继续黑客攻击。

我只想指出,一旦你编写了几个程序,调试并维护了它们,你就会开始明白为什么大多数人将大量全局变量视为等待发生的问题,这是我们耦合的来源尝试从一开始就设计出我们的系统。

Python 和其他语言提供的功能旨在减少不必要的耦合,缩小变量的范围,以便清楚它们影响的代码位。 Function arguments 帮助解决这一需求。 定义class可能是解决方案的重要组成部分。

朋友提到scope相关的问题,按照他说的解决即可。

作为第二种方法,您可以将 playerNumber 变量作为您使用的 function 的参数,该变量存储您从用户那里获得的值。 这将是声明全局变量的更安全的方法

def playerColour(playerNumber:int):
       // some logic


def start():
    print ("Welcome to python Snake! A game made by Kippo and inspired by the famous game: Snake!")
    playerNumber = int(input("How many players are going to play? (2-4)"))
    if playerNumber >= 5:
        print("Too many players! Try again.")
        start()
    elif playerNumber <= 1:
        print("Too few players! Try again.")
        start()
    else:
        playerColour(playerNumber)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM