あなたの問題は、ここ(および以下)
に記載されているPythonのスコープによるものです:
LEGBルール。
- ローカル。
関数内で何らかの方法で割り当てられ、その関数でグローバルに宣言されていない名前。
- 関数ローカルを囲みます。
すべての囲んでいる関数 (def
またはlambda
) のローカル スコープ内の名前 (内部から外部への形式)。
- グローバル(モジュール)。
モジュール ファイルの最上位で割り当てられた名前、またはファイル内の定義でグローバルに宣言された名前。
- 組み込み(Python)。
組み込みの名前モジュールで事前に割り当てられた名前:open, range, SyntaxError
など
したがって、x
変数は にローカルな変数ですmain()
。したがって、ローカル スコープから変数を取得するには、グローバル変数もローカルスコープに取得できます。
あなたのコードには、さまざまな論理エラー (およびいくつかNameError
の s) があるようです。私は理解しようとし、あなたのコードを動作するものに変更/改良しました。
def menu():
global x
while x not in ('1','2'): # 1
print " Menu"
print "1) Login"
print "2) Under dev"
x = raw_input('Select menu option: ') # 2
if x in ('1','2'): # 1
break
x = ''
menu()
# 3
if x == '1':
y = raw_input("enter username: ") # 2
z = raw_input("enter password: ") # 2
if y != 'username' or z != 'password': # 4
print "username or password incorrect"
else: # 5
print 'You will be logged in'
elif x == '2':
print "Under development"
文法的な変更以外に、論理的な部分の変更を見てみましょう。
raw_input
文字列を返します。1
したがって、 or 2
(整数)になることはありません。
また、Python ではと同等であり、常に値を持つため、x != 1 or 2
に評価されます。True
(x != 1) or (2)
2
True
raw_input
入力を取得する前に表示される引数としてプロンプトを受け取ります
- 簡単に言えば、if と elif の構造が正しくありません。
y or z == False
(y) or (z = False)
は文字列であるため、 Andz
は決して評価されませんFalse
。ではない
場合、これは True と評価されますが、それはあなたが望むものとは異なります (そう思われます)。y
''
- のコードは
else
、if (およびすべての elif) 条件が の場合に実行されますFalse
。
ここでは、開発中のメッセージを示します。
もっと来る