Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python不会对变量重新声明发出警告_Python - Fatal编程技术网

Python不会对变量重新声明发出警告

Python不会对变量重新声明发出警告,python,Python,我花了一整天的时间来追踪这个bug: for idx, val in enumerate(some_list): for idx, otherval in enumerate(another_list): #the idx for the outer loop is overwritten #blah blah 对于idx,枚举中的val(一些列表): 对于idx,枚举中的otherval(另一个列表):#覆盖外部循环的idx #废话 来自强类型语言背景的我,被这深深地咬

我花了一整天的时间来追踪这个bug:

for idx, val in enumerate(some_list): for idx, otherval in enumerate(another_list): #the idx for the outer loop is overwritten #blah blah 对于idx,枚举中的val(一些列表): 对于idx,枚举中的otherval(另一个列表):#覆盖外部循环的idx #废话
来自强类型语言背景的我,被这深深地咬了一口。在强类型语言中,我会得到一个关于变量重新声明的错误。我不知道为什么解释器不对此发出警告,以及背后的设计决策。这显然是一个bug,我的意思是,这个构造的合法用途可能是什么?是否有任何选项可以启用此类检查?谢谢。

这就是Python的工作原理,您可以自由地重新定义变量。如果您希望它的行为像一种静态类型的语言,那么您只会失望。

无法启用这种检查。通常我建议使用linting工具,但是
pylint
(我最喜欢的)似乎没有注意到这一点,而且
pychecker
也没有注意到这一点

至于理由:你想允许像

a = 1
a = 2
好的,那你呢

a = ""
a = 1
那也应该可以。现在呢

a = 1
for a in range(5):
你看到问题了吗?什么应该是错误/警告,什么不应该是错误/警告,还不是很清楚


(我承认我希望像
pychecker
这样的工具能够捕捉到这件事,我有点失望。)

Python变量是通过它们的第一次使用隐式地“声明”的:
idx=1
然后,
idx=2
会触发相同的警告;对于(i=1;i@Blorgbeard是的,但是
for(inti=0;i<10;i++){for(inti=0;i<10;i++){……}
编译器会捕获that@Blorgbeard这是始终使用
for(int i..
而不是
int i;for的一个很好的理由(i..
。我编写的C代码最接近您的python代码,因为它没有重新定义变量-只是重用它。Obv.在C中,您不会这样做。但python就是这样工作的。