Python 3.6中的名称错误

Python 3.6中的名称错误,python,python-3.x,nameerror,Python,Python 3.x,Nameerror,我对编码是新手,正在做一个简单的数学项目。 我有以下代码: #!/usr/bin/env python3 import sys; print(sys.version) import random ##Creates values to use to make random equation. x = random.randint(1,11) y = random.randint(1,11) if x > y: total = random.randint(x, 20) else

我对编码是新手,正在做一个简单的数学项目。 我有以下代码:

#!/usr/bin/env python3
import sys; print(sys.version)
import random

##Creates values to use to make random equation.

x = random.randint(1,11)
y = random.randint(1,11)
if x > y:
    total = random.randint(x, 20)
else:
    total = random.randint(y, 20)

##Creates actual values for A,B,C, and D in equation A+B=C+D

a = x
b = total - a
c = y
d = total - y

##Prints option choices and asks for user input

def start_game_message():
    print ("Please fill in the blanks to make the following equation true:")
    print ("__+__=__+__")
    print ("The option choices are:" + str(a) + ", " + str(b) + ", "  + str(c) + ", " + str(d))
def ask_for_input():
    blank1 = input("What is the value of the first blank?")
    blank2 = input("What is the value of the second blank?")
    blank3 = input("What is the value of the third blank?")
    blank4 = input("What is the value of the fourth blank?")
start_game_message()
##Check if user input is correct
def check_answer():
    ask_for_input()
    print (blank1)
    if int(blank1)+ int(blank2) == int(blank3) + int(blank4):
        print ("That is correct!")
    else:
        print ("That is incorrect. Please try again.")
        ask_for_input()
check_answer()
运行此命令时,我会出现以下错误:

Traceback (most recent call last):
  File "C:/Users/duncs/PycharmProjects/moms_app/main", line 42, in <module>
    check_answer()
  File "C:/Users/duncs/PycharmProjects/moms_app/main", line 36, in check_answer
    print (blank1)
NameError: name 'blank1' is not defined
回溯(最近一次呼叫最后一次):
文件“C:/Users/duncs/PycharmProjects/moms_app/main”,第42行,在
检查答案()
文件“C:/Users/duncs/PycharmProjects/moms\u app/main”,第36行,检查答案
打印(空白1)
NameError:未定义名称“blank1”
我做错什么了吗?我为每个应该存储的空白输入值。如果我将print(blank1)放在ask_for_inputs函数中,它可以很好地打印。但是当我稍后在check_answers函数中调用该函数时,它会导致错误。我不能在另一个函数中调用函数吗?
请帮忙!谢谢。

blank1变量的范围仅限于ask\u for\u input()函数。您需要全局声明函数定义之外的所有
空白
变量

在下一行之后添加

d = total - y
blank1=''
blank2=''
blank3=''
blank4=''
blank5=''

您的范围有问题-请参阅

它的缺点是
check\u answer
函数无法“查看”
blank1
变量
blank1
仅在定义
check\u answer
之前在
ask\u for\u input
中引用过,在Python(以及大多数现代语言)中,这是行不通的。功能是自私的,喜欢把里面的一切都留给自己;你必须与他们合作,让他们与其他功能共享

有几种解决方案:

  • blank1
    设置为全局(但是您应该不要这样做-请参阅)
  • 定义
    check\u answer
    ask\u输入
    (我不建议这样做)
  • blank1
    作为一个参数传递给调用者,并将
    input
    调用
    ask\u for\u input
    的结果返回给调用者,这样您就可以将用户输入从
    ask\u for\u input
    中穿出并进入
    check\u answer

  • 我个人建议用3。如果需要的话,我可以用更具体的例子来详细说明。

    我认为解决这个问题的最好方法是修复您的
    请求输入()

    这可以通过
    return
    将结果传回,从而避免范围问题。它还减少了代码重复,并利用
    列表
    存储4个输入

    至于为什么代码不起作用,这是因为如果检查堆栈,您会看到:

    global
        check_answer
            ask_for_input
            -blank1
            -blank2
            -blank3
            -blank4
    
    ask\u for\u input
    返回时,其堆栈帧丢失:

    global
        check_answer
    

    因此,您必须找出如何得出这些结果,或者通过分配到范围更广的变量(建议使用
    global
    ),或者通过
    return
    将blank1的范围和其他空白变量都指定为局部变量。你必须使它们成为全局变量


    *编辑:看来我的回复有点晚了。其他答案都是很好的解决方案。

    您提供了一个完整的解决方案,但没有真正向OP解释为什么您的解决方案比原始提交的解决方案更好。另外:“如果你以堆栈为例”-这到底意味着什么?我的意思是:当OP对编码如此陌生的时候,OP应该如何理解这一串单词呢?@Piercedaragh如果OP有问题,我会毫不犹豫地澄清问题,我确实希望能够找到一些解决方案。你列出三个选项,其中两个是公认的坏选项,然后说如果需要,你可以详细说明。我直接切入正题。我也认为你的解释是补充性的,没有理由重复,尽管我不同意人格化功能。好眼力:我修正了那个打字错误。。。我想我可能把检查和取样结合起来了。。。exsampled xD.足够公平;OP显然更喜欢你的解决方案,所以这是一个没有意义的观点,哈哈。)我不认为内部函数定义本身是“坏的”。。。但对于这个问题,这肯定不是正确的选择(这就是为什么我说我会建议第三个选项,尽管我想我还不够明确!)。干杯非常感谢你。我还没有学会全局变量和局部变量。我也没有想到一个创造性的方式来接受你的意见。非常感谢。@Duncan,每当你发现自己一遍又一遍地重复同样的事情时,你可能做了比你需要做的更多的工作。
    global
        check_answer