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