2016-12-24 17 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が、後でローカル変数として使用されることです。これはあなたがループオーバー(グローバルなクラス名dropをシャドウイングしているリストからインスタンスにローカル変数としてdropを結合し、ループの各パスで

for drop in rain_drops: 

:このfor文は汚い仕事をします変数)。関数内のローカル変数として名前が使用されている場合、関数の任意のポイントで同じ名前のグローバルにアクセスすることはできません(fooが存在しない場合、print(foo); foo="bar"のように、以前)。

おそらく、この問題のための最良の修正はほとんどのクラスはCapWordsスタイル名を持つべきであると言うことPython styleに合わせて、Dropにあなたのクラスの名前を変更することです。そうすれば、Drop(クラス)とdrop(あなたがループしているときにアクセスするインスタンス)の間で名前が競合することはありません。

+0

ありがとうございました!幸せな休日を! –