python 里面for代码块不是域!

  笔者虽然在写python的时候已经被提醒过这个点了,但是在写python的时候还是顺其自然的把强语言类型的东西带了进来,自然而然就把for in代码块当成了域,我们先看这个代码:

if __name__ == '__main__':

    for i in range(10):

        x = 0

    print(x)

如果你有c#或者其他一些语言的反应,第一反应,肯定是稳稳的报错,x明明是for的局部变量,怎么可能在外面得到!

然而世界就这么离奇,你运行一下就知道多么神奇,结果如下:


结果是0!!!!!为什么会拿到值,这个让我代码出bug,让我debug了很久的罪魁祸首!

让我们看一看文档压压惊

python2 解释如下:

The for-loop makes assignments to the variable(s) in the target list.

This overwrites all previous assignments to those variablees including those made in the suite of the for-loop.

...

The target list is not deleted when the loop is finished.

But if the sequence is empty, they will not have been assigned to at all the loop.

for 后面跟着的变量(target list)在循环结束后是不会被删除的,

但如果 for 循环的序列为空,这些变量是完全不会被赋值的。

这在Python中是个大坑啊。

避免这个坑的解决办法就是规范命名规范。

比如用于循环的变量尽量使用单字符。在任何有疑议的情况可以直接将索引值初始化。

很不幸,Python 3中这点没有改变。

你可能感兴趣的:(python 里面for代码块不是域!)