2016-12-24 4 views
0

ich die folgende Störung erhalte:Unbounded Lokale Fehler 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. 

Es ist etwas, mit dem Umfang des Tropfens() in das zu tun, wenn ich alle main() der Tropfen() nur dadurch, dass existiert Umfang. Ich habe versucht, mit einer globalen Variable herumzualbern, um das rain_drops-Array zu füllen, aber ich kann nicht scheinen, dass dieser Fehler verschwindet. Auch Stil Kommentare würden sehr geschätzt werden. Code ist unten.

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() 

Antwort

0

Das Problem, das Sie haben sind, ist, dass drop als lokale Variable in Ihrer Funktion später verwendet wird. Diese for Aussage macht die schmutzige Arbeit:

for drop in rain_drops: 

bei jedem Durchlauf der Schleife, das bindet drop als lokalen Variable auf eine Instanz aus der Liste Sie sind Schleife über (Shadowing die Klassennamen drop, die ein global Variable). Wenn ein Name als lokale Variable in einer Funktion verwendet wird, kann an keiner Stelle der Funktion auf einen global gleichen Namen zugegriffen werden (der Compiler geht davon aus, dass Sie Dinge außerhalb der Reihenfolge tun, wie print(foo); foo="bar", wenn foo nicht existiert vorher).

Wahrscheinlich die beste Lösung für dieses Problem wäre, Ihre Klasse in Drop umzuwandeln, in Übereinstimmung mit Python style, die besagt, dass die meisten Klassen CapWords Stilnamen haben sollten. Auf diese Weise haben Sie keinen Namenskonflikt zwischen Drop (die Klasse) und drop (eine Instanz, auf die Sie zugreifen, während Sie eine Schleife erstellen).

+0

Vielen Dank! Schöne Ferien! –

Verwandte Themen