我已经研究了这个主题的几个问题,但我相信这是一个新情况。我在PyCharm 2022.2.2中有这样的Python代码:
res = []
for i in range(10):
j = i
for k in range(4):
res.append(j)
j = j + 1
在线j = 1
PyCharm抱怨:
"在没有使用的情况下重新声明上面定义的"j";。
显然上面没有声明j
。将线路更改为j += 1
,警告消失。
PyCharm是困惑还是我遗漏了什么?
如果您查看范围,我认为警告是正确的:
9.2.Python作用域和命名空间
(…(
虽然作用域是静态确定的,但它们是动态使用的。在执行过程中的任何时候,都有3或4个嵌套作用域的命名空间可以直接访问:
最内部的范围,首先搜索,包含本地名称
从最近的封闭作用域开始搜索的任何封闭函数的作用域包含非本地但也包含非全局名称
(…(
只有一个作用域,外部和内部for
都是最内部作用域的一部分,因为它们是循环,不是函数也不是方法。
显然
j
没有在上面声明。
j
是在外部for
中声明的,这将其置于与i
相同的范围中。请参阅Python"for"循环中的Scoping中的这个简明答案。
"在没有使用的情况下重新声明上面定义的"j";。
这里的技巧是,linter警告您变量没有在外部for
循环中使用。这意味着你的代码不是"蟒蛇。。。一种更像蟒蛇的写作方式是:
res = []
for i in range(10):
for k in range(i, i+4):
res.append(k)
在这里,您已经去掉了多余的j
声明(以及警告(。代码变得更容易使用,因为您不必考虑额外的j
变量以及它的值如何在两个循环之间更改和共享。这就是警告试图告诉你的。
关于版本的结束说明:
但我相信这是一个新情况。我在PyCharm 2022.2.2中有这样的Python代码:
正确。我在旧款PyCharm 2022.1中尝试过,但门楣不会发出警告。所以这是最近的一个变化(尽管在类似的情况下,我在其他版本中也遇到过这个警告(。