Python for 变量作用域

for x in range(5):
    pass

print(x)
# 打印x结果是: 4

def test():
    _list = []
    for i in range(4):
        _list.append(lambda: i)
    return _list


print([f() for f in test()])
# [3, 3, 3, 3]

上面代码输出的是 [3, 3, 3, 3],而不是[0, 1, 2, 3],这是因为,在Pyhton中是没有block这个概念的。

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

  • Local:在lambda函数内或者def函数内部的变量
  • Enclosing-function:闭包的作用域(了解Python的闭包可以看《闭包初探》)
  • Global:全局作用域
  • Build-in:内建作用域

Python参考文档在for循环章节明确记录了这个行为:
For循环向目标列表里的变量赋值,[…]在该循环结束时,目标列表里的名字不会被删除,但如果该序列是空的,那么该循环完全没有向它们赋值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。