您的问题是由于此处(及以下)
所述的 Python 范围:
LEGB 规则。
- 当地的。
在函数中以任何方式分配的名称,而不是在该函数中声明为全局的。
- 封闭函数局部变量。在任何和所有封闭函数(或)
的本地范围内命名,从内到外。def
lambda
- 全局(模块)。
在模块文件的顶层分配的名称,或在文件内的 def 中声明的全局名称。
- 内置(Python)。
内置名称模块中预先分配的名称:open, range, SyntaxError
等
因此,您的变量x
是本地main()
变量。因此,要将变量移出局部范围,您也可以将全局变量移出局部范围。
您的代码似乎有各种逻辑错误(和一些错误NameError
)。我试图理解并已将您的代码更改/改革为可行的方法。
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
因为它等同于 Python,(x != 1) or (2)
并且在 Python 中2
始终具有一个True
值。
raw_input
将提示作为参数,在获取输入之前显示
- 简而言之,您的 ifs 和 elifs 的结构不正确。
y or z == False
被评估为(y) or (z = False)
And z
is never False
,因为它是一个字符串。
所以,如果y
is not ''
,那么 this 被评估为 True,但这不像你想要的东西(看起来)..
- 如果 if(和所有elifs
else
)条件是False
.
在这里,我们给出了正在开发的消息。
更多即将到来