无限制的本地错误Python

时间:2016-12-24 00:33:38

标签: 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()

1 个答案:

答案 0 :(得分:0)

您遇到的问题是drop稍后会在您的函数中用作局部变量。这个for语句完成了肮脏的工作:

for drop in rain_drops:

在循环的每次传递中,这会将drop作为局部变量绑定到您循环的列表中的实例(隐藏类名drop,这是一个全局变量)。当一个名称用作函数中的局部变量时,您无法在函数中的任何位置访问同名的全局变量(编译器假定您执行的操作不正常,例如print(foo); foo="bar" if { {1}}以前不存在。)

此问题的最佳解决方法可能是将您的班级重命名为foo,与Python style一致,即大多数班级应该有Drop个样式名称。这样你就不会在CapWords(类)和Drop(你在循环时访问的实例)之间发生名称冲突。