跳到内容

重定义的循环名称 (PLW2901)

源自 Pylint 代码检查工具。

作用

检查在 for 循环和 with 语句中定义的变量是否在主体中被覆盖,例如被另一个 for 循环或 with 语句或直接赋值覆盖。

为什么这不好?

在循环体内部重新定义循环变量会导致其值与原始循环迭代的值不同,这可能会导致错误。

在 Python 中,与许多其他语言不同,for 循环和 with 语句不定义自己的作用域。因此,使用与外部循环相同目标变量名称的嵌套循环将重用相同的实际变量,并且最后一次迭代的值将“泄露”到封闭循环的其余部分。

虽然这个错误在小型示例中很容易发现,但它可能隐藏在较大的代码块中,变量的定义和重新定义可能不会同时可见。

示例

for i in range(10):
    i = 9
    print(i)  # prints 9 every iteration

for i in range(10):
    for i in range(10):  # original value overwritten
        pass
    print(i)  # also prints 9 every iteration

with path1.open() as f:
    with path2.open() as f:
        f = path2.open()
    print(f.readline())  # prints a line from path2