Python:为什么这有效?

时间:2016-12-27 20:58:25

标签: python pygame global-variables

这是我的基本随机运动程序,其中一个立方体向下运行,每次向下运行时,每次向下运行时都会向右运行。

编写程序时,我收到以下错误消息: UnboundLocalError:局部变量' wantedcordx'在分配之前引用 和 UnboundLocalError:局部变量' wantedcordy'在分配前引用

我通过在函数内部使变量全局但不知道为什么我必须这样做或为什么它起作用来解决问题:

接下来的节目:(写得不是很好,我是一个乞丐)

import pygame,sys,random
from pygame.locals import *

#colours
red =(255,0,0)
white=(255,255,255)

#variables/objects
x = 50
y = 50
FPS = 60
clock =pygame.time.Clock()
screen = pygame.display.set_mode((800,600))
xcord = random.randint(1,100)
ycord = random.randint(1,100)

newcords_needed = False
run_once = False
def get_newcords():
    global x,y
    global run_once
    global newcords_needed
    wantedcordx
    global wantedcordy


    if run_once == False:

        xcord = random.randint(1, 100)
        ycord = random.randint(1, 100)
        wantedcordy = (y + ycord)
        wantedcordx = (x + xcord)
        run_once = True
        print(wantedcordx)

    if newcords_needed == True:
        xcord = random.randint(1,100)
        ycord = random.randint(1,100)
        wantedcordy = (y + ycord)
        wantedcordx = (x + xcord)
        newcords_needed = False

    if x != wantedcordx:
        x_done = False
        x +=1


    elif x == wantedcordx:
        x_done = True

    if x_done == True:
        if y  != wantedcordy:
        y +=1
        elif y == wantedcordy:
            y_done = True
            newcords_needed = True
    return (x,y)





while True:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    get_newcords()
    screen.fill(white)
    pygame.draw.rect(screen, red, [x,y,20,20])
    pygame.display.update()

它从不正确地复制和粘贴,但我尽力重新格式化。

2 个答案:

答案 0 :(得分:1)

def get_newcords()中的

,如果run_once == Truenewcords_needed == False,则第一次访问变量wantedcordx位于:

if x != wantedcordx:

因为在这种情况下它第一次访问是通过读取访问,所以你会得到未定义的变量",除非你像你一样定义它全局。

(同样适用于wantedcordy

定义它们global具有以下效果:因为在第一次调用该函数时,您将wantedcordx分配给某个东西,它在下一个函数调用中仍然有效。

答案 1 :(得分:1)

查看Python的官方编程文档常见问题解答,特别是关于"为什么我在变量有值时得到UnboundLocalError?":https://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value

在处理了为什么以及在哪里"全球"之后的问题。需要,这也可能对你有所帮助。

简而言之,它是Python语言中的一种选择,允许访问全局定义"隐含地" (这意味着它在大多数情况下是一个安全的假设),但改变它们的能力需要明确使用"全球"关键词。限制是提醒您正在修改可能共享的内容(即全局),如果您不注意,可能会在代码的其他部分引入意外的副作用。他们没有要求"全球"因为产生的混乱会破坏全局声明识别副作用的有用性。"

应该注意的是,在许多场景中使用全局变量被认为是不好的做法,不仅仅是在Python中,而且Python中的理想解决方案通常是利用模块提供的命名空间系统。我在链接到您的常见问题部分中对此进行了详细说明。然而,在开发一个简单的游戏时,将一组全局变量作为真实的真实来源通常是有用的(实际的?)。在任何给定的时刻代表大部分代码都可以访问的世界状态。