Python中Namespace/scope confusion:循环变量为何覆盖全局变量?
Python循环作用域与迭代逻辑的问题解答
先看你给出的代码:
kk = 7 for kk in range(2): # 取值0到1 for kk in range(90,92): # 取值90到91 for kk in range(10,12): # 取值10到11 print(kk) kk
1. 为何循环未使用独立作用域,反而覆盖全局kk?
Python的for循环不会为循环变量创建新的作用域,所有层级的kk都属于同一个全局命名空间。不管哪一层循环,迭代时都是把当前值直接赋值给全局的kk变量,完全覆盖之前的取值。
比如初始kk=7,进入最外层循环后,第一次迭代把kk设为0;接着进入中间层循环,把kk改成90;再进入最内层循环,依次把kk设为10、11;最内层循环结束后,中间层下一次迭代把kk设为91,再重复最内层的赋值操作;中间层循环结束后,外层循环第二次迭代把kk设为1,再次走一遍中间和内层的流程,最终kk停在最内层循环的最后一个值11。
2. 为何外层循环未因kk被设为10(超出其range范围)而提前结束?
Python的for循环是基于预先生成的可迭代对象进行迭代,不是依赖循环变量的实时值来判断是否继续的while循环。外层循环在启动时,就已经确定了要迭代的所有元素——range(2)生成的[0,1],后续不管kk被改成什么值,外层循环都会按这个固定的序列依次完成所有迭代,每次迭代开始时只是把序列里的下一个元素重新赋值给kk,中间修改kk不会影响迭代的进度。
内容的提问来源于stack exchange,提问作者Tim Ziemer
相关产品推荐
相关产品推荐

