2017-11-06 20 views
0
def login(): 
    userinfo = open("userinfo.txt","r") 
    userinforec = userinfo.readline() 
    username1 = input("What is your username?\n") 
    while userinforec != "": 
     field = userinforec.split(",") 
     username = field[0] 
     password = field[1] 
     name = field[2] 
     age = field[3] 
     year = field[4] 
     mathseasy = field[5] 
     mathsmed = field[6] 
     mathshard = field[7] 
     hiseasy = field[8] 
     hismed = field[9] 
     hishard = field[10] 
     if username != username1: 
      print("Error, username not found") 
      break 
     else: 
      password1 = str(input("What is your password?\n")) 
      if password == password1: 
       print("password accepted") 
       writereport(username) 
      else: 
       print("Error, password not accepted") 
       login() 
      userinforec = userinfo.readline() 
    userinfo.close() 
    return username 
タイトルで述べたように、私は、コードのこの部分を実行すると

まさに、それが最終ラインで(ユーザ名を返す)と述べています割り当て前に参照されます。UnboundLocalError:ローカル変数(関数の戻り部分に)割り当て前に参照した「ユーザ名」

UnboundLocalError: local variable 'username' referenced before assignment

私は他のスレッドを見て、変数がしかし、ここでそれはない関数の外にある場合、それすべてが発生しました。まだglobalを使用する必要がありますか、これを回避する別の方法がありますか?

+1

'while userinforec!=" "::'ループが入力されない場合、 'username'は決して開始されません。 'while'ループの外でいくつかのデフォルト値に設定します –

+0

whileループの外側で変数 'username'を設定することを意味する場合は、すでに@RNarを持っています。 EDIT: あなたの名前はループ外です –

+0

@SkidSolo 、いいえ、あなたはしません。 'userinfo'、' userinforec'と 'username1'を初期化します。 'username'が任意の値に初期化される最初の行は、whileループの中にあります(つまり、' username = field [0] ') –

答えて

0

whileループが入力されなかった場合、たとえばuserinforec == ""あなたはusernameを返すので、それを任意の値で割り当てることになります。

whileループの前にusername = ""を追加すると、whileループ中に割り当てられていない場合は、その値に値が設定されます。

関連する問題