Python:为什么这样做?

2024-10-05 14:22:11 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的基本随机运动程序,立方体每次向下和向右,都会沿着不同的距离向下和向右运行。你知道吗

在编写程序时,我收到了以下错误消息: 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()

它从来没有复制和粘贴正确,但我尽我所能重新格式化它。你知道吗


Tags: runfalsetrueifrandomglobalpygamerandint
2条回答

查看Python的官方编程文档FAQ,特别是关于“当变量有值时为什么会出现UnboundLocalError?”:https://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value

紧接着的问题涉及到为什么以及在哪里需要“全球”,这可能对你也有帮助。你知道吗

简而言之,在Python语言中,允许“隐式”访问全局定义是一种选择(这意味着在大多数情况下这是一种安全的假设),但是更改它们的能力需要显式使用“global”关键字。限制是提醒您,您正在修改可能共享的内容(即全局),如果您不注意,可能会在代码的其他部分引入意外的副作用。他们不需要“全球”来获取价值的唯一原因是,由此产生的“混乱将破坏全球宣言在确定副作用方面的有用性”

应该注意的是,在许多场景中使用globals被认为是不好的做法,而不仅仅是在Python中,Python中的理想解决方案通常是使用模块提供的名称空间系统。这在我链接到您的常见问题部分中有更详细的介绍。然而,当开发一个简单的游戏时,它通常是有用的(实用的?)在任何给定的时刻,将一组globals作为“一个真正的真理之源”代表世界的状态,代码的大部分都可以访问。你知道吗

def get_newcords()中,如果run_once == Truenewcords_needed == False,则第一次访问变量wantedcordx的时间如下:

if x != wantedcordx:

因为在这种情况下,第一次访问它是通过读访问,所以会得到“undefined variable”,除非像以前一样定义它为全局变量。你知道吗

(同样适用于wantedcordy

定义它们global具有以下效果:因为在函数的第一次调用时,您将wantedcordx赋值给某个对象,所以它在下一次函数调用中仍然有效。你知道吗

相关问题 更多 >