我正在使用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()
当您在sample_func内时,主函数的if分支内的代码实际上在作用域内。您可以从变量
x
中读取(尝试一下)。这没关系,因为你并不真正关心它,所以你有几个选择前进。1)禁用pycharm中的阴影警告。老实说,这是最直接的,这取决于你对程序员的经验,这可能是最有意义的(如果你是相对较新的,我不会这样做,虽然)
2)将主代码放入主函数中。这可能是任何生产级代码的最佳解决方案。Python非常擅长按照您想要的方式来做事情,因此您应该小心不要落入陷阱。如果你正在构建一个模块,在模块级拥有大量的逻辑会让你陷入困境。相反,以下内容可能会有所帮助:
3)不要使用与在更大范围内使用的变量名相同的变量名。这很难执行,而且有点与1相反。
警告是关于在内部作用域中重新使用这些名称所带来的潜在危险。它会让你错过一个虫子。例如,考虑一下
因为您使用了相同的名称,所以在函数中拼写错误不会导致错误。
当你的代码非常简单的时候,你就可以摆脱这种类型的事情而不会产生任何后果。但是,为了避免在更复杂的代码上出现错误,使用这些“最佳实践”是很好的。
它只是一个警告,正如链接问题中所解释的,有时它会导致问题,但在您的情况下
x
是您的函数本地的。您收到警告是因为x
中的if __name__ == "__main__":
位于全局中。它不会对函数中的x
产生任何影响,因此我不会担心警告。相关问题 更多 >
编程相关推荐