Python NameError,但已定义变量

Python NameError,但已定义变量,python,defined,Python,Defined,我写这篇文章是为了练习Python。循环应该接受用户输入并使用eval函数对其进行评估,当用户输入done时,循环中断。返回在输入完成之前的输入 该代码对于输入(如5、10+3等)工作正常。但当我输入done作为输入时,会出现以下错误: Traceback (most recent call last): File "C:/Users/rosem/Progs/1101D4.py", line 11, in <module> eval_loop()

我写这篇文章是为了练习Python。循环应该接受用户输入并使用eval函数对其进行评估,当用户输入done时,循环中断。返回在输入完成之前的输入

该代码对于输入(如5、10+3等)工作正常。但当我输入done作为输入时,会出现以下错误:

Traceback (most recent call last):
  File "C:/Users/rosem/Progs/1101D4.py", line 11, in <module>
    eval_loop()
  File "C:/Users/rosem/Progs/1101D4.py", line 6, in eval_loop
    print(eval(s))
  File "<string>", line 1, in <module>
NameError: name 'done' is not defined

你不能那样评估“文本”。我真诚地建议你无论如何不要用eval来解决这个问题。但是如果你不得不这样做,你可以改变顺序,试试看

def eval_loop():
    while True:
        x = ('done')
        s = input("write a thing. ")
        s1 = s
        #check if input is 'done'
        if s == x:
            break
        else:
            try:
                #evaluate
                print(eval(s))
            #error caused by s being something like 'foo'
            except NameError:
                pass 
    return s1
eval_loop()

你不能那样评估“文本”。我真诚地建议你无论如何不要用eval来解决这个问题。但是如果你不得不这样做,你可以改变顺序,试试看

def eval_loop():
    while True:
        x = ('done')
        s = input("write a thing. ")
        s1 = s
        #check if input is 'done'
        if s == x:
            break
        else:
            try:
                #evaluate
                print(eval(s))
            #error caused by s being something like 'foo'
            except NameError:
                pass 
    return s1
eval_loop()
NameError:name'done'未定义正在发生,因为您没有检查输入是否在使用eval之前完成。相反,请尝试以下方法:

def eval_loop():
    while True:
        s = (input("write a thing. "))
        s1 = s
        if s == 'done':
            break
        print(eval(s))

    return s1

eval_loop()
如果不检查,python将尝试运行done,这将抛出错误

另请参见Brain的评论和另一个答案。

名称错误:名称“完成”未定义正在发生,因为您没有检查输入是否在使用eval之前完成。相反,请尝试以下方法:

def eval_loop():
    while True:
        s = (input("write a thing. "))
        s1 = s
        if s == 'done':
            break
        print(eval(s))

    return s1

eval_loop()
如果不检查,python将尝试运行done,这将抛出错误

另请参阅Brain的评论和另一个答案。

如果您仅使用x来检查输入是否='done',那么只要在s='done'时执行即可:@havenieday您的意思是如果s='done':,对,您在哪里学会了以这种方式使用eval?您几乎肯定不想在任意用户输入上使用eval。永远,永远,永远,永远,永远!!!这是非常不安全的,并且在99%的情况下是不必要的。如果您仅使用x检查输入是否='done',那么如果s=='done',则只需执行即可:@havenieday您的意思是如果s=='done',则正确,您在哪里学会了以这种方式使用eval?您几乎肯定不想在任意用户输入上使用eval。永远,永远,永远,永远,永远!!!这是非常不安全的,并且在99%的情况下是不必要的。