0

我刚开始用 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"
4

4 回答 4

6

x is a local variable in the menu() function, it doesn't exist outside of menu().

You could return it from menu() then store the value in a new x in your code:

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()

Note that I fixed several problems with your code in menu() as well.

  • raw_input() returns a string, but you test if x is integer 1 or 2 instead. I changed the code to test for the strings '1' and '2' instead.

  • Don't use x != 1 or 2, that does not mean what you think it means. It tests if x != 1 is True, and if not, it tests if 2 is True. 2 is always True because all non-zero numbers are considered True in a boolean context.

    I replaced that with a x not in ('1', '2') test.

  • There is no need to test x inside the loop again and execute a break; the while loop will just exit on its own without that test.

  • It doesn't really matter what x is set to at the start of menu(), as long as it is not '1' or '2'. None is a good choice to signal that it is 'empty'.

于 2013-03-17T14:38:30.270 回答
0

The variable x is defined in the menu function. It is this a local variable, and only accessible from the body of the function. This answer has good explanation of Python scoping rules.

于 2013-03-17T14:37:55.440 回答
0

如果您仍然对使用全局变量和局部变量感到困惑,请查看此网站

于 2013-03-17T15:27:25.927 回答
0

您的问题是由于此处(及以下)
所述的 Python 范围: LEGB 规则。

  • 当地的。
    在函数中以任何方式分配的名称,而不是在该函数中声明为全局的。
  • 封闭函数局部变量。在任何和所有封闭函数(或)
    的本地范围内命名,从内到外。deflambda
  • 全局(模块)。
    在模块文件的顶层分配的名称,或在文件内的 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"

除了语法上的变化,让我们看看逻辑部分的变化。(评论中的数字指的是详细说明变化的地方。)

  1. raw_input返回一个字符串。所以,它永远不会是12(整数)。
    此外,x != 1 or 2将评估为,True因为它等同于 Python,(x != 1) or (2)并且在 Python 中2始终具有一个True值。
  2. raw_input将提示作为参数,在获取输入之前显示
  3. 简而言之,您的 ifs 和 elifs 的结构不正确。
  4. y or z == False被评估为(y) or (z = False)And zis never False,因为它是一个字符串。
    所以,如果yis not '',那么 this 被评估为 True,但这不像你想要的东西(看起来)..
  5. 如果 if(和所有elifs else)条件是False.
    在这里,我们给出了正在开发的消息。

更多即将到来

于 2013-03-17T15:35:12.630 回答