Python for 变量作用域

96 阅读1分钟
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循环向目标列表里的变量赋值,[…]在该循环结束时,目标列表里的名字不会被删除,但如果该序列是空的,那么该循环完全没有向它们赋值。