python错误unboundLocalE

2024-09-28 22:23:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我是编程新手,但我喜欢自然语言(如你所见)。我想写一个简单的程序来帮助测试法语现在时动词。然而,在这段代码中,我一直收到错误消息,因为correctAnswers显然没有设置为全局变量。有什么主意!?在

import random

level1=["(manger)","je mange", "tu manges", "il mange", "elle mange", "nous mangeons", "vous mangez", "ils mangent", "elles mangent"]
level2=["(boire)", "je bois", "tu bois", "il boit", "elle boit", "nous buvons", "vous buvez", "ils boivent", "elles boivent"]

correctAnswers=0
blanks = '_' * 8

def getVerb():
    verbIndex=random.randint(1,len(level1)-1)
    print (level1[verbIndex].split()[0], blanks, level1[0])
    ans=input()
    while ans==level1[verbIndex].split()[1]:
        correctAnswers=correctAnswers+1
        print ("Nice one!")
        print (correctAnswers)
        getVerb()
    else:
        print ("Bad luck!")
        getVerb()


getVerb()

Tags: randomilnousprintjetuilslevel1
3条回答

我清理了你的代码,让它更像Python。现在就试试:

import random

def getVerb():
    level1 = ["(manger)","je mange", "tu manges", "il mange", "elle mange", "nous mangeons", "vous mangez", "ils mangent", "elles mangent"]
    level2 = ["(boire)", "je bois", "tu bois", "il boit", "elle boit", "nous buvons", "vous buvez", "ils boivent", "elles boivent"]

    blanks = '_' * 8
    correctAnswers = 0
    randomElement = random.choice(level1)

    print(randomElement.split()[0], blanks, level1[0])

    ans = input()

    while True:
        if ans == randomElement.split()[1]:
            correctAnswers += 1

            print("Nice one!")
            print(correctAnswers)
        else:
            print("Bad luck!")

        ans = input()

if __name__ == '__main__':
    getVerb()

correctAnswers=0超出范围。它们应该在getVerb内。你也不需要递归。在

假设你想测试每一个级别和每个问题一次:

import random


level1=["(manger)","je mange", "tu manges", "il mange", "elle mange", "nous mangeons", "vous mangez", "ils mangent", "elles mangent"]
level2=["(boire)", "je bois", "tu bois", "il boit", "elle boit", "nous buvons", "vous buvez", "ils boivent", "elles boivent"]
blanks = '_' * 8

def getVerb():    
    correctAnswers = 0        

    # Do each level once
    for level in (level1, level2):
        level_name, choices = level[0], level[1:]

        # Shuffle the choices, this makes sure we only do each question once
        random.shuffle(choices)

        # Go through all the choices once
        for choice in choices:
            prefix, suffix = choice.split(' ', 2)
            print (prefix, blanks, level_name)

            ans = raw_input('Answer: ') # input() if Python 3
            while True:
                if ans == suffix:
                    correctAnswers += 1
                    print ("Nice one!")
                    print (correctAnswers)

                    # Got the right answer, break out
                    break
                else:
                    print ("Bad luck!")
                    # Change prompt to "Try again" on failure
                    ans = raw_input('Try again: ') # input() if Python 3


getVerb()

如果您可以通过预拆分零件或使用dict控制level1/level2输入,则可以进一步优化此功能

正如@Cixate所提到的,可以通过设置correctAnswers = 0内部getVerb并用while循环替换递归来解决这个问题:

def getVerb():
    correctAnswers = 0
    ... the rest of your code, as before ...
    ... making sure to replace the recursion with a while-loop ...

问题是Python实际上看到两个不同的变量,在两个不同的范围内,具有相同的名称。这会导致所谓的“阴影”发生。在

因此,Python只在getVerb内部使用getVerb的{}版本。而且这个变量从未被赋予值!所以Python抱怨说您试图在没有分配它的情况下使用它。在

但是。。。等待!我们没有赋值吗?好吧,我们分配了一个名为correctAnswers的变量,但它是一个不同的变量,具有不同的范围。在

查看以下示例:

^{pr2}$

所以,总结一下这种疯狂:

  • y1看到来自外部作用域的x——在第一行声明
  • y2创建自己的x——不能看到或使用另一个
  • 不管y2给它自己的x分配了一个新值,外部的{}仍然没有变化——请参见outer 3和{}
  • y3还创建了自己的x,但在它有值之前尝试使用它->;崩溃并烧录!!在

做这一个改变将使你的程序工作。尽管这不是立即需要的,但您最终可能希望改进代码质量,并学习如何编写更地道的Python代码。例如:

  • 用while循环替换递归
  • 使用字典
  • {{cd19>代替

但是,如果你继续保持良好的工作,这将随着时间和经验的自然到来!在

相关问题 更多 >