“在赋值前使用变量X”错误弹出,原因不明

2024-06-16 11:41:44 发布

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

我读过这个错误,但问题是我认为我不应该在这里得到这个错误,我从来没有见过有人有这个问题。这是我的代码:

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问题”警告确实让我很困扰。在我的代码中,这种情况发生在更多的地方,例如:

^{pr2}$

这行代码在同一个函数中也给出了相同的错误,但由于某些原因它不再出现,而是集中在我函数的第三行代码上。另外,sterge_lambda(sir)只是简单地将某个字符替换为“”,不确定一个单行函数是否值得创建,但是无论如何。在

注:代码是用python3.7在VSCode中编写的。在


Tags: lambda函数代码indexlenreturndef错误
2条回答

visualstudio使用的默认linterpylint正在抱怨,因为在调用substituie()之前,它没有找到任何代码可以为sir赋值,并且运行sir = sterge_lambda(sir)中的表达式sterge_lambda(sir)。在

这可能表示您的代码有问题,因为在实际执行subtituie()时,没有在任何地方设置全局名称sir,那么您将得到一个NameError: name 'sir' is not defined异常。在

如果您确定在项目中不会发生这种情况,可以告诉pylint忽略此特定问题,方法是在同一行添加一个# pylint: disable=...条目,其中...将替换为当您悬停在红线上时对话框中可见的错误代码:

sir = sterge_lambda(sir)  # pylint: disable=E0601

或者您可以对E0601使用符号名,即used-before-assignment

^{pr2}$

您可以通过在命令行上运行pylint list-msgs来查看消息名称及其错误代码的完整列表,也可以使用pylint help-msg=<code-or-name>访问单个消息的信息。在

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

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

将导致弹出错误消息,尽管执行仍正常进行,但以下代码:

^{pr2}$

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

相关问题 更多 >