谈谈Python for循环的作用域

对于从其他语言转到Python的人来说,下面这段代码显得很诡异:

你期望的是i变量不存在报错,而实际上打印结果是:

这是因为,在Pyhton中,是没有block这个概念的。

Python中的作用域只有四种,即LEGB规则:

L, local – 在lambda函数内或者def函数内部的变量

E, Enclosing-function – 闭包的作用域(了解Python的闭包可以看《闭包初探》)

G,Global – 全局作用域

B, Build-in – 内建作用域

举个例子:

由此看来,for循环的作用域会污染局部作用域,Python2的列表生成式也会有这个副作用,但是已经在Python3中得到了修复。

曾经Python邮件列表中有人想“如果在for-loop中有函数引用变量,就将此变量变成for-loop局部变量”,但是造成这个的问题并不是for循环的问题,而是闭包的迟绑定

谈谈Python for循环的作用域”已经有2条评论

  1. js,php都是这样的。虽然没有块作用域,但是写代码的时候还是习惯当成有块作用域来写,不然维护代码的时候会看晕的。

    • 嗯,知道了之后还是要留神不要不小心覆盖作用域内的变量。一刀切的解决办法就是在函数内永远不重复使用一个变量的名字(覆盖)。

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注