2016-08-23 6 views
-1

私はDjangoに小さなアプリケーションを作成していますが、私はviews.pyのメソッドから宣言したいくつかの変数に状態を保存しています。ここでは、このファイルの重要な部分である:Django: "代入の前に参照されていますが、一部の変数のみ"

from app.playerlist import fullList 
auc_unsold = fullList[:] 
auc_teams = [] 
auc_in_progress = [] 
auc_current_turn = -1 
print(auc_in_progress) 

def auc_action(request): 
    data = json.loads(request.GET["data"]) 

    # ... 

    elif data[0] == "start": 
     random.shuffle(auc_teams) 
     print(auc_unsold) 
     print(auc_in_progress) 
     auc_in_progress = [None, 0, None] 
     print(auc_in_progress) 

auc_unsoldauc_teams変数が正常に動作。ただし、auc_in_progress変数はこのメソッドでは表示されませんが、タイトルにエラーがあります。 printステートメントを取り出して、このコードで値を代入させると、その変数を再び使用するとすぐに、例外がコード内の他の場所にスローされます。

私は別の変数を作成しようとしましたが、この新しいものもこの問題を抱えているようです。

何が起こっていますか?


編集:私は解決策を見つけた:私はちょうどprint文の前global auc_in_progressを書く場合は、すべてが正常に動作します。私がそれを書こうとすると、上の変数が何らかの理由でうまく動作しないと宣言しています。

私はこれがなぜ起こるのかわからないので、私はこれに満足していません、そして、私はそういうグローバルな使い方が嫌いです。誰か説明がありますか?

答えて

1

元のコードまたは提案されたソリューションのいずれかをglobalで絶対に行わないでください。

モジュールレベルのものは、現在のユーザーだけでなく、すべてユーザーのプロセス間で共有されます。誰も同じオークションを見ることになります。

エラーの原因は、関数内でその変数に代入して自動的にローカル変数にするためです。詳しくは、this questionを参照してください。しかし、あなたの回避策と同じ、つまりglobalを使用することで推奨される解決策は、ここでは適切ではありません。セッションなどのユーザーに関連した特定の場所にデータを格納する必要があります。

+0

でも、もっと多くの人が同じオークションに参加できるようにすることです... 私はそれが醜いと私は "正しい"方法を知らないことに同意します、それはおそらくデータベースと何かもっと構造化されますか?しかし、これは私が私といくつかの友人のために作っている単純なアプリなので、特に私は期限が来ているので、私のために迅速かつ汚い作品。 – user1846231

関連する問題