这是我的基本随机运动程序,其中一个立方体向下运行,每次向下运行时,每次向下运行时都会向右运行。
编写程序时,我收到以下错误消息: 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()
它从不正确地复制和粘贴,但我尽力重新格式化。
答案 0 :(得分:1)
def get_newcords()
中的,如果run_once == True
和newcords_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中的理想解决方案通常是利用模块提供的命名空间系统。我在链接到您的常见问题部分中对此进行了详细说明。然而,在开发一个简单的游戏时,将一组全局变量作为真实的真实来源通常是有用的(实际的?)。在任何给定的时刻代表大部分代码都可以访问的世界状态。