【问题标题】:NameError: name 'playerNumber' is not defined - even though i defined it in another functionNameError: name \'playerNumber\' is not defined - 即使我在另一个函数中定义了它
【发布时间】:2022-11-14 14:02:40
【问题描述】:

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

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()

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

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    让我们谈谈范围。

    你写了这个:

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

    也就是说, start() 进行赋值, playerColor() 希望读取该值。

    但是你从来没有声明一个全局值 在这两个方面都处于最高水平 访问的功能。

    分配playerNumber = -1 最后,在顶层, 在致电start() 之前, 在start 中添加global 声明, 你会看到不同的行为。


    范围

    Python 维护变量命名空间 在不同的可见度级别, 包括“顶级”和“本地到 一个函数”,例如 start() 或 播放器颜色()。

    一个参考到一个名字会探测 依次排列几个命名空间, 匹配函数的局部变量 在顶级全局变量之前。

    一个任务在一个函数中通常会 创建一个局部变量,它去 超出范围(被销毁) 退出函数。

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

    name = "Alice"
    
    def set_name():
        name = "Bob"
    
    set_name()
    print(name)
    

    问题:这将显示什么?

    答案:爱丽丝。为什么?因为当我们 设置名称,我们创建了一个新的本地 多变的。然后我们从未使用过, 它在功能时被破坏 退出。

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

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

    在实践中,大多数代码会更喜欢 封装这样的代码和数据 在一个班级内,分配给self.name 反而。 但这是另一天的话题。


    全局变量

    你才刚刚开始编程, 我为此鼓掌,加油, 继续黑客攻击。

    我只想指出,一旦你 写了几个程序, 调试和维护它们, 你会开始明白为什么大多数 人们查看很多全局变量 作为一个等待发生的问题, 我们尝试设计的耦合源 从一开始就脱离我们的系统。

    【讨论】:

      猜你喜欢
      • 2022-12-02
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2017-01-09
      • 2017-06-14
      • 2023-03-11
      相关资源
      最近更新 更多