Python中为何在for循环体修改集合不影响循环范围?
为什么修改集合变量后for循环没遍历新增元素?
这是因为Python的for循环在启动时,会先基于初始的集合对象生成一个迭代器,之后整个循环过程都会用这个迭代器来取元素——哪怕你把变量s1重新赋值成了新的集合,也不会影响已经生成的迭代器,它只会老老实实遍历最初那三个元素。
你可以把这个过程拆开来理解:
s1 = {1,2,3} s2 = {4,5,6} # 先生成基于初始s1的迭代器 iterator = iter(s1) # 循环用的是这个iterator,和后续s1指向什么无关 for p in iterator: print(p) if p == 2: s1 = s1.union(s2)
这里s1只是个变量,重新赋值只是让它指向了新的集合对象,但循环依赖的迭代器是绑定在最初的{1,2,3}上的,自然不会遍历新集合里的4、5、6。
如果想要实现“修改集合后让循环遍历新增元素”的效果,可以改用while循环,每次基于当前集合的状态来获取未处理的元素:
s1 = {1,2,3} s2 = {4,5,6} processed = set() while s1 - processed: # 取出一个未处理的元素 current = (s1 - processed).pop() processed.add(current) print(current) if current == 2: s1 = s1.union(s2)
这样运行后就能得到你预期的输出:1、2、3、4、5、6。
内容的提问来源于stack exchange,提问作者Алексей Рыжов
相关产品推荐
相关产品推荐

