这是我的基本随机运动程序,每次下降时,多维数据集都会沿着不同的距离奔跑,并且每次都向右行驶。
编写程序时,我有一个错误消息:UnbounlocalError:分配前引用的本地变量'WantingCordx'和unboundlocalerror:在分配之前引用的本地变量'wantercordy
我通过将两个变量全局整体化为函数内部解决问题,但不知道为什么我必须这样做或为什么起作用:
这个程序:(写得不好,我是乞egginer)
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()
它从来没有正确地编写和粘贴,但我尽了最大的努力将其重新格式化。
查看python的官方编程文档常见问题解答,特别是有关"为什么变量具有值时我会得到unboundlocalerror的部分?":https://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalError-when-the-then-then-then-then-the-baria-has-a-value
在处理为什么和何处需要"全局"之后,问题也可能对您有所帮助。
简而言之,这是python语言的选择,允许"隐式"访问全局定义(在大多数情况下,这是一个安全的假设),但是更改它们的能力需要明确使用"全局"关键字。限制是提醒您,您正在修改可能共享的内容(即全局),如果您不注意,可能会在代码的其他部分中引入意想不到的副作用。他们不需要"全局"才能访问该值的唯一原因是因为由此产生的"混乱"会破坏全球声明以识别副作用的有用性。"
应该指出的是,在许多情况下,在许多情况下,不仅在Python中使用全球群体被认为是不良练习,而且Python中理想的解决方案通常是利用模块提供的命令系统。在我链接您的常见问题解答部分中,这进一步详细介绍了这一点。但是,当开发一个简单的游戏时,在任何给定的时刻,将一组全球群体作为"一个真实的真实来源"通常是有用的(实用吗?p>
在def get_newcords()
中,如果run_once == True
和newcords_needed == False
,则首次访问变量wantedcordx
是:
if x != wantedcordx:
由于在这种情况下第一次访问它是通过读取访问权限,因此您会获得"未定义变量",除非您像您一样定义它。
(wantedcordy
也是如此)
定义它们 global
具有以下效果:自从函数首次调用以来,您将 wantedcordx
分配给某物,它在下一个函数调用中仍然有效。