2016-12-24 4 views
0

Я получаю следующее сообщение об ошибке:Неограниченные Локальная ошибка Python

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. 

Это что-то делать с объемом капли() в том, что, когда я все основные() падение() существует только в том, объем. Я попытался объединиться с глобальной переменной, чтобы заполнить массив 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

Проблема у Вас есть то, что drop используется в качестве локальной переменной позже в вашей функции. Это for заявление делает грязную работу:

for drop in rain_drops: 

На каждом проходе цикла, это связывает drop в качестве локального переменного к экземпляру из списка вы находитесь перебирают (затенение имени класса drop, который является глобальным переменная). Когда имя используется как локальная переменная в функции, вы не можете получить доступ к глобальному одноименному имени в любой точке функции (компилятор предполагает, что вы делаете что-то не по порядку, например print(foo); foo="bar", если foo не существует ранее).

Возможно, лучшим решением для этой проблемы было бы переименование вашего класса на Drop, в соответствии с Python style, в котором говорится, что большинство классов должно иметь имена стиля CapWords. Таким образом, у вас не было бы конфликта имен между Drop (классом) и drop (экземпляр, к которому вы обращаетесь, когда вы зацикливаете).

+0

Большое вам спасибо! Счастливого праздника! –

Смежные вопросы