python - 无限的本地错误 Python

标签 python exception compiler-errors

我收到以下错误:

Traceback (most recent call last):
  File "prpR.py", line 48, in <module>
    main()
  File "prpR.py", line 39, in main
    d=drop()
UnboundLocalError: local variable 'drop' referenced. 

这与 drop() 的范围有关,因为当我全部 main() 时, drop() 仅存在于该范围内。我曾尝试使用全局变量来填充 rain_drops 数组,但我似乎无法让这个错误消失。样式评论也将不胜感激。代码如下。
 from graphics import *
from random import randint
#(137,43,226)
#(229,230,250) -BG

#d=None
class drop:
    dc = color_rgb(136,43,226)
    win=GraphWin("Purple Rain-Prince", 498, 500, autoflush=False)
    win.setBackground(color_rgb(228,230,250))
    win.setCoords(0,0,1000,1000)    
    lwr=6 #length to width ratio length:width
    def __init__(self):
        x= randint(0,1000)
        self.diff=randint(-1,10)        
        y=randint(0,1000)
        p1= Point(x, y)
        p2=Point(x+self.diff,y+drop.lwr*self.diff)
        self.r=Rectangle(p-1, p2)
        self.r.setFill( color_rgb(136,43,226))
        self.r.draw(drop.win)
    def reset(self):
        x= randint(0,1000)
        self.diff=randint(1,20)         
        y=998
        p1= Point(x, y)
        p0=Point(x+self.diff,y+drop.lwr*self.diff)
        self.r.undraw()
        self.r=Rectangle(p1, p2)
        self.r.setFill( color_rgb(136,43,226))
        self.r.draw(drop.win)
    def fall(self):
        self.r.move(0,-self.diff)   
        if self.r.getP0().getY()<5:
            self.reset()

def main():
    d=drop()
    rain_drops=[drop() for i in range(38)]
    while(drop.win.checkMouse()==None):
        for drop in rain_drops:
            drop.fall()
        update(28)
    drop.win.close()

main()

最佳答案

您遇到的问题是 drop稍后在您的函数中用作局部变量。这个for声明做了肮脏的工作:

for drop in rain_drops:

在循环的每一轮中,这将绑定(bind) drop作为一个局部变量到你循环的列表中的一个实例(隐藏类名drop,它是一个全局变量)。当一个名称在函数中用作局部变量时,您无法在函数中的任何位置访问同名的全局变量(编译器假定您正在做一些乱序,例如 print(foo); foo="bar" 如果 foo以前不存在)。

解决此问题的最佳方法可能是将您的类(class)重命名为 Drop , 符合 Python style这表示大多数类应该有 CapWords样式名称。这样您就不会在 Drop 之间发生名称冲突(类(class))和drop (您在循环时访问的实例)。

关于python - 无限的本地错误 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309287/

相关文章:

java - 检查用户输入是否为 Int,无异常?

c++ - 使用 C++ 模板编译类成员变量?

c - 实现一个C函数来计算两位数字

python - 不同路径之间的多个公共(public)前缀

c++ - 我想捕获一个异常并将其捆绑在我自己的异常中并向上抛出

python - 在 str 对象上使用 'to_datetime' - 为了更改数据帧列名称

java : "error: unreported exception Exception; must be caught or declared to be thrown"

c++ - 使用 STL 算法的命名空间和用户定义的运算符

python - 创建许多相关对象,如 INSERT ... SQL 中的 SELECT

python - Python中的json到csv转换返回单行?