1.4 - 循环控制流语句与列表、字典、集合的迭代问题
1.4.1 控制流语句
循环结构for 常和 range() 联用来进行一些列值枚举;range()用来返回一个可迭代对象。
break / continue 控制循环。
循环for/while 也有else子句,else子句的触发条件是:循环的判断条件为False时会进入到else子句执行;但是 由break终止的循环 不会进入到else子句。
1.4.2 列表迭代问题
如果想要通过迭代列表的方式,依次删除列表的元素:
# 被删除的列表 lst = [1,2,3] for x in lst: lst.remove(x) print(lst)
上述的做法是错误的,最终 print(lst) 的输出结果为 [2]。
解析:for-in迭代实际是调用的列表的索引,而列表会对内存自动管理,即:在删除列表中的元素时,Python会自动 对列表内存进行收缩。因此上述在对列表元素依次遍历的时候,索引逐渐增大而lst的长度逐渐减小,最终会导致漏删。
解决方案1:
lst = [1,2,3,4] lst2 = copy.deepcopy(lst) for x in lst2: lst.remove(x) # 删除列表某个值的第一个匹配项,返回值 None print(lst)
解决方案2:
lst = [1,2,3,4,5] length = len(lst) for _ in range(length): lst.pop(0) # pop()方法,删除指定索引位置的元素。默认删除最后一个,返回删除的元素值。 print(lst)
1.4.3 字典、集合的迭代问题
字典、集合在遍历时,如果改变原数据的size,则会造成迭代时报错。
同理:遍历时 对字典/集合 本身、浅拷贝、动态视图( 如 字典的dict.keys() )等做出修改也会影响迭代过程。
解决方法:深拷贝,然后迭代遍历。