我刚刚开始使用Python进行编程,但我得到 x未定义但我不知道为什么它会说考虑到我认为它是定义的。
def menu():
x = 0
while x != 1 or 2:
print "menu"
print "1)login"
print "2)under dev"
x = raw_input('select menu option')
if x == 1 or 2:
break
menu()
if x=='1':
print "enter username:"
y = raw_input()
if y=="username":
print "enter password:"
z = raw_input()
if z=="password":
print "password accepted"
elif x=='2':
print "under development"
elif y or z == False:
print "username or password incorrect"
答案 0 :(得分:6)
x
是menu()
函数中的本地变量,它不存在于menu()
之外。
您可以从menu()
返回,然后将值存储在代码中的新x
中:
def menu():
x = None
while x not in ('1', '2'):
print "menu"
print "1)login"
print "2)under dev"
x = raw_input('select menu option')
return x
x = menu()
请注意,我还修复了menu()
中代码的几个问题。
raw_input()
返回一个字符串,但您测试x
是否为整数1或2。我更改了代码以测试字符串'1'
和'2'
。
不要使用x != 1 or 2
,不表示您认为的含义。它测试x != 1
是否为True,如果不是,则测试2
是否为True。 2
总是 True
因为在布尔上下文中所有非零数字都被视为True。
我用x not in ('1', '2')
测试替换了它。
无需再次在循环内测试x
并执行break
; while
循环将在没有该测试的情况下自行退出。
只要不是x
或menu()
,'1'
在'2'
开头设置的内容并不重要。 None
是一个很好的选择,表示它是“空的”。
答案 1 :(得分:0)
变量x
在menu
函数中定义。这是一个局部变量,只能从函数体中访问。这个答案对Python scoping rules有很好的解释。
答案 2 :(得分:0)
如果您仍然对使用全局和局部变量感到困惑,请查看this website。
答案 3 :(得分:0)
你的问题是因为Python的范围
陈述here(及以下):
LEGB规则。
def
或lambda
)的本地范围内的名称,从内到外形成。open, range, SyntaxError
等因此,您的x
变量是本地到main()
的变量。因此,要将变量从 local 范围中取出,您也可以将全局变量提取到本地范围。
您的代码似乎有各种逻辑错误(以及一些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
或2
(整数)
此外,x != 1 or 2
将评估为True
,因为它等同于(x != 1) or (2)
,而2
在Python中始终具有True
值。 raw_input
将提示作为参数,在从y or z == False
评估为(y) or (z = False)
而z
永远不会False
,因为它是一个字符串。y
不是''
,那么这会被评估为True,但这不是你想要的东西(似乎)...... else
,则会执行False
中的代码。更多