2017-03-29 5 views
-1

私は悪夢を抱いています。私は仮想キューをシミュレートするためにPythonでコードを作成しました。関数内とメインコード内に同じ変数があるのでUnboundLocalErrorを取得しています

コードは単純ですが、私は続けることを繰り返す以外は動作するはずです。

'aList'は、関数のパラメータとして、またメインコード内の変数とdefの関数内にあるという問題があると思います。

コードは長すぎず、this linkにあります。

誰か助けてもらえますか?私は'global aList'を追加しようとしましたが、解決しませんでした。

ありがとうございました。以下のコードの

スナップショット:

def aRemove(aList): 
    newlist = [] 
    for i in range(1,len(aList)): 
     newlist.append(aList[i]) 
    aList = newlist 
    return (aList) 

user_request() 
aList = ["mark","jon","peter"] 
aList = (aRemove(aList)) 
print(aList) 
+0

@ShadowRan ger - ヘルプの編集に感謝します。 – kingpete84

+1

ようこそ。コードブロックに必要なのは余分な4つのスペースインデントだけです。いずれにせよ、あなたが提供したスニペットは、(あなたが定義していない 'user_request()'呼び出しとは別に、書かれているように完璧に動作します。それは誤解を招く( 'aList'に割り当てられても呼び出し側が変更されず、新しい' list'が返され、呼び出し側はそれを修正して再バインドします)、それは正常に動作します。あなたが持っていると言う問題を持っていないか、それを引き起こすコードを提供していないかのどちらかです。エラーからのトレースバックとそのトレースバックに関連付けられたコードを提供します。 – ShadowRanger

+0

@ShadowRanger - メッセージのコードにコードの断片(64行の長さ)を入れます(メッセージに完全なコードへのリンクがあります)。エラーは「行55、user_requestで」 aList =ローカル変数 'aList'が代入の前に参照されています。ローカルではない変数とグローバル変数については読んだことがありますが、問題を把握することができず、時間がなくなってしまいました。 – kingpete84

答えて

0

問題がaListのがまだ割り当てられた値を持っていないということです。私は個人的にちょうどあなたのコードの非常にbegginingに

aList = [] 

を宣言するだろうが、それは、それがuser_request宣言の前にあるように動作します。あなたはSatishの解決法に従って、あなたの関数にもそれを渡すことができます。

もう1つの問題は、削除機能です。

for i in range(1,len(aList)): 

は、そうでない場合、あなたが存在しない要素を追加しようとしている

for i in range(1,len(aList)-1): 

に変更する必要があります。それはあなただけのこの操作を行うことができ、Pythonのため、けれども :

aList = aList[1:] 
+1

Pythonには可変減速がありません。 –

+0

はまだ割り当てられていません...それは意味論的な問題であり、技術的な問題ではありません。しかし編集。私の文章の後には、それがどういう意味であるかという直接的な例があります。 javaのような宣言は、 'int variable' という意味ではありませんが、今からリストになるaList変数があると宣言していないという事実はありません。 –

0

コードのエラーが原因で、コードのではありませんが、あなたが問題の追加が、リンクで提供あなたのコードを見てきたスニペット。

user_request()内にaListを使用していますが、どこにも宣言されていません。これはあなたのエラーを解決しなければなら

user_request(aList) 

:あなたはこのような何か何をすることができます。

def user_request(aList):     
    order = input("What would you like to do P | A | N | L | M | Q \n") 
    while True: 
     if order == 'P': 
      aPrint() 
     elif order == 'A': 
      useradd = input("what would you like to add to the queue?") 
      aAdd(useradd) 
     elif order == 'N': 
      aList = (aRemove(aList)) # aList used without passed 
     elif order == 'L': 
      aList = (aLeave(aList,input("What would you like to remove from the queue?"))) 
     elif order == 'M': 
      aLocation() 
     elif order == 'Q': 
      aQuit() 

をし、このように呼び出し元の関数を置き換えます。

注:エラーを発生させる行番号は、エラーをより迅速かつ効率的にデバッグするのに役立ちます。

0

表示されているエラーは、投稿したコードスニペットではなく、(ペーストビンコードの)user_request機能によって発生しています。その中で、グローバル変数aListを参照しようとしていますが、ローカル変数も再割り当てしています。何が起こっているか言い換えしようとし

、PythonはaRemove(aList)がまだ存在していないローカル連想リスト変数、を参照している前提としています。

次の2つの方法でこの問題を解決することができます

def user_request():     
    global aList 
    order = input("What would you like to do P | A | N | L | M | Q \n") 
    while True: 
     if order == 'P': 
      aPrint() 
     elif order == 'A': 
      useradd = input("what would you like to add to the queue?") 
      aAdd(useradd) 
     elif order == 'N': 
      aList = (aRemove(aList)) 
     elif order == 'L': 
      aList = (aLeave(aList,input("What would you like to remove from the queue?"))) 
     elif order == 'M': 
      aLocation() 
     elif order == 'Q': 
      aQuit() 

または、お近くのaList変数の名前を変更します。

は、ローカルaListがグローバルaListと同じであることのpythonを伝えるために、あなたの関数内global aListを追加しますグローバル変数にもはや衝突しないようにしました。

+0

グローバル変数を使用することは、Pythonでの悪い習慣です。これを読んでください:http://stackoverflow.com/questions/19158339/why-are-global-variables-evil –

関連する問題