我收到以下错误:
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()
答案 0 :(得分:0)
您遇到的问题是drop
稍后会在您的函数中用作局部变量。这个for
语句完成了肮脏的工作:
for drop in rain_drops:
在循环的每次传递中,这会将drop
作为局部变量绑定到您循环的列表中的实例(隐藏类名drop
,这是一个全局变量)。当一个名称用作函数中的局部变量时,您无法在函数中的任何位置访问同名的全局变量(编译器假定您执行的操作不正常,例如print(foo); foo="bar"
if { {1}}以前不存在。)
此问题的最佳解决方法可能是将您的班级重命名为foo
,与Python style一致,即大多数班级应该有Drop
个样式名称。这样你就不会在CapWords
(类)和Drop
(你在循环时访问的实例)之间发生名称冲突。