为什么Python lint要求我使用不同的局部变量名而不是全局变量名

Mar*_*eck 10 python pylint

给定Python代码如

def func():
    for i in range(10):
        pass

for i in range(10):
    pass  
Run Code Online (Sandbox Code Playgroud)

pylint抱怨

Redefining name 'i' from outer scope 
Run Code Online (Sandbox Code Playgroud)

什么是Pythonic写上面的方法?在本地使用不同的变量,比方说j

但是,当变量在两种情况下(i对于索引)意味着完全相同时,为什么呢.假设我将所有本地索引更改为j,然后我发现我想j用作glocal范围中的第二个索引.要改变一下吗?

我无法禁用lint警告,我不想拥有它们,我想写Pythonic,但我想在同样的事情中使用相同的名称,在上面的简单情况下.这不可能吗?

Rob*_*obᵩ 26

您可以通过不使用任何全局变量来避免全局变量冲突:

def func():
    for i in range(10):
        pass

def _init_func():
    for i in range(10):
        pass  

_init_func()
Run Code Online (Sandbox Code Playgroud)

任何需要在模块初始化时运行的代码都可以放在一个函数中.这留下了作为模块init:def语句,class语句和一个函数调用期间运行的唯一可执行代码.

同样,如果您的代码不是要import编辑的,而是要运行的脚本,

def func():
    for i in range(10):
        pass

def main():
    for i in range(10):
        pass  

if __name__=="__main__":
    main()
Run Code Online (Sandbox Code Playgroud)


Oli*_*rLi 1

linter 会发出警告,因为i如果它至少运行一次,它就会在循环之后继续存在。这意味着,如果您要使用它而不重新初始化它,它仍然具有上次循环迭代期间的值。

你使用它的方式很好,因为它i总是会被重新初始化。

一种有用的做法是将外部范围中的所有值命名为ALL_CAPS. 这样就不会出错了。

这个答案被正确地确定为错误的。请参阅: https: //stackoverflow.com/a/25072186

  • 根据 [PEP-8](http://legacy.python.org/dev/peps/pep-0008/#constants),这会给阅读代码的程序员提供错误的提示:“常量通常在模块上定义级别并全部用大写字母书写,并用下划线分隔单词。” (11认同)