我不明白为什么我在Python中得到“x未定义”

时间:2013-03-17 14:35:11

标签: python python-2.7

我刚刚开始使用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 个答案:

答案 0 :(得分:6)

xmenu()函数中的本地变量,它不存在于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循环将在没有该测试的情况下自行退出。

  • 只要不是xmenu()'1''2'开头设置的内容并不重要。 None是一个很好的选择,表示它是“空的”。

答案 1 :(得分:0)

变量xmenu函数中定义。这是一个局部变量,只能从函数体中访问。这个答案对Python scoping rules有很好的解释。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你的问题是因为Python的范围 陈述here(及以下):
LEGB规则。

  • 的OCAL。
    在函数中以任何方式分配的名称,并且未在该函数中声明为全局。
  • E nclosing function locals 在任何和所有封闭函数(deflambda)的本地范围内的名称,从内到外形成。
  • G lobal(模块)。
    在模块文件的顶级分配的名称,或在文件中的def中声明为全局的名称。
  • B uilt-in(Python)。
    在内置名称模块中预先指定的名称: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"

除了语法上的变化之外,让我们看一下逻辑部分的变化。(注释中的数字是指详细说明变化的点。)

  1. raw_input返回一个字符串。因此,它永远不会是12(整数)  此外,x != 1 or 2将评估为True,因为它等同于(x != 1) or (2),而2在Python中始终具有True值。
  2. raw_input将提示作为参数,在从
  3. 获取输入之前显示
  4. 简单地说,ifs和elifs的结构不正确。
  5. y or z == False评估为(y) or (z = False)z永远不会False,因为它是一个字符串。
    所以,如果y不是'',那么这会被评估为True,但这不是你想要的东西(似乎)......
  6. 如果if(和所有elifs)条件为else,则会执行False中的代码。
    在这里,我们给出了开发中的消息。
  7. 更多