弹出“在分配之前使用变量X”错误没有明显原因

时间:2018-10-18 17:24:03

标签: python python-3.x visual-studio-code

我已经阅读了有关此错误的信息,但事实是我不认为我应该在这里收到此错误,而且我从未见过有人遇到此问题。这是我的代码:

def substituie(caractere):
    lista_optiuni = genereaza_lista_substitutii(caractere)

    global sir
    sir = sterge_lambda(sir)
    while lista_optiuni != []:
        index = randrange(0,len(lista_optiuni))
        if len(sir) + len(lista_optiuni[index])-1 > 60:
             lista_optiuni.remove(lista_optiuni[index])
        else: 
             sir = sir.replace(caractere,lista_optiuni[index],1)
             sir = sterge_lambda(sir)
             return True
    return False

问题出在我的变量“ Sir”上。我有一个名为“ Sir”的外部变量,我希望函数在不将其作为参数传递的情况下更改其某些方面。因此,我将其声明为函数内部的全局变量,但仍然收到错误,好像我的函数不知道此变量是谁。另外,该代码可以正常工作,并且完全可以执行我想要的操作,但是它下面的红线和“源代码管理”选项卡中的“ 1问题”警告确实使我感到困扰。这在我的代码中的更多地方发生了,例如:

global sir
sir = sir.replace(caractere,lista_optiuni[index],1)

这行代码在相同的函数中也给出了相同的错误,但由于某种原因,它不再起作用,而是着重于我函数的第三行代码。另外,sterge_lambda(sir)只是用''替换了一个特定的角色,不确定一个函数是否值得制作,但是无论如何。

P.S .:该代码是在VSCode中用Python 3.7编写的。

2 个答案:

答案 0 :(得分:0)

Visual Studio使用的默认linter pylint抱怨,因为在调用sir和表达式{{之前,它没有找到任何可以为substituie()分配内容的代码。语句sterge_lambda(sir)中的1}}运行。

这可能表明您的代码有问题,因为在实际执行sir = sterge_lambda(sir)时,任何地方都没有设置全局名称sir,那么您将得到一个subtituie()异常。

如果您确定这不会在您的项目中发生,可以通过在同一行上添加一个NameError: name 'sir' is not defined项(其中pylint来告诉# pylint: disable=...忽略此特定问题)。将鼠标悬停在红线上方时,将其替换为对话框中可见的错误代码:

...

或者对于E0601,您可以使用符号名sir = sterge_lambda(sir) # pylint: disable=E0601

used-before-assignment

您可以通过在命令行上运行sir = sterge_lambda(sir) # pylint: disable=used-before-assignment 来查看消息名称及其错误代码的完整列表,或者可以使用pylint --list-msgs访问有关单个消息的信息。

答案 1 :(得分:0)

似乎定义函数和声明在所述函数内部使用的全局变量的顺序很重要。时间:

def substituie(caractere):
    lista_optiuni = genereaza_lista_substitutii(caractere)

    global sir
    sir = sterge_lambda(sir)
    while lista_optiuni != []:
       index = randrange(0,len(lista_optiuni))
       if len(sir) + len(lista_optiuni[index])-1 > 60:
           lista_optiuni.remove(lista_optiuni[index])
       else: 
           sir = sir.replace(caractere,lista_optiuni[index],1)
           sir = sterge_lambda(sir)
           return True
    return False

sir = start

虽然执行仍然可以正常执行,但会导致弹出错误消息,该代码:

sir = start

def substituie(caractere):
    lista_optiuni = genereaza_lista_substitutii(caractere)

    global sir
    sir = sterge_lambda(sir)
    while lista_optiuni != []:
       index = randrange(0,len(lista_optiuni))
       if len(sir) + len(lista_optiuni[index])-1 > 60:
           lista_optiuni.remove(lista_optiuni[index])
       else: 
           sir = sir.replace(caractere,lista_optiuni[index],1)
           sir = sterge_lambda(sir)
           return True
    return False

不抱怨任何问题。唯一的区别是,在第一个版本中,函数中使用的变量是在函数定义之后声明的。这不是执行问题,只是它的解释方式。