来自外部scop的阴影名称xyz

2024-03-28 18:39:05 发布

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

我正在使用pycharm,它列出了与代码相关的所有错误/警告。虽然我了解其中的大多数,但我不确定这一个“从外部范围阴影名称xyz”。有一些关于这个的帖子:How bad is shadowing names defined in outer scopes?但是他们似乎正在访问一个全局变量。

在我的例子中,我的__main__函数有几个变量名,然后它调用另一个函数sample_func,它再次使用这些变量名(主要是循环变量名)。我假设,因为我在一个不同的函数中,这些变量的作用域将是局部的,但是警告似乎表明不是这样。

有什么想法吗?以下是一些代码供您参考:

def sample_func():
    for x in range(1, 5):  --> shadows name x from outer scope
        print x

if __name__ == "__main__":
    for x in range(1, 5):
        sample_func()

Tags: sample函数代码namein名称警告for
3条回答

当您在sample_func内时,主函数的if分支内的代码实际上在作用域内。您可以从变量x中读取(尝试一下)。这没关系,因为你并不真正关心它,所以你有几个选择前进。

1)禁用pycharm中的阴影警告。老实说,这是最直接的,这取决于你对程序员的经验,这可能是最有意义的(如果你是相对较新的,我不会这样做,虽然)

2)将主代码放入主函数中。这可能是任何生产级代码的最佳解决方案。Python非常擅长按照您想要的方式来做事情,因此您应该小心不要落入陷阱。如果你正在构建一个模块,在模块级拥有大量的逻辑会让你陷入困境。相反,以下内容可能会有所帮助:

def main():
    # Note, as of python 2.7 the interpreter became smart enough
    # to realize that x is defined in a loop, so printing x on this
    # line (prior to the for loop executing) will throw an exception!
    # However, if you print x by itself without the for loop it will
    # expose that it's still in scope. See https://gist.github.com/nedrocks/fe42a4c3b5d05f1cb61e18c4dabe1e7a
    for x in range(1, 5):
        sample_func()

if __name__ == '__main__':
    main()

3)不要使用与在更大范围内使用的变量名相同的变量名。这很难执行,而且有点与1相反。

警告是关于在内部作用域中重新使用这些名称所带来的潜在危险。它会让你错过一个虫子。例如,考虑一下

def sample_func(*args):
    smaple = sum(args) # note the misspelling of `sample here`
    print(sample * sample)

if __name__ == "__main__":
    for sample in range(1, 5):
        sample_func()

因为您使用了相同的名称,所以在函数中拼写错误不会导致错误。

当你的代码非常简单的时候,你就可以摆脱这种类型的事情而不会产生任何后果。但是,为了避免在更复杂的代码上出现错误,使用这些“最佳实践”是很好的。

它只是一个警告,正如链接问题中所解释的,有时它会导致问题,但在您的情况下x是您的函数本地的。您收到警告是因为x中的if __name__ == "__main__":位于全局中。它不会对函数中的x产生任何影响,因此我不会担心警告。

相关问题 更多 >