1.4 - 循环控制流语句与列表、字典、集合的迭代问题

发布时间 2024-01-08 14:56:38作者: 虎头小黑

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的长度逐渐减小,最终会导致漏删。

解决方案:

lst = [1,2,3,4]
lst2 = copy.deepcopy(lst)
for x in lst2:
  lst.remove(x)
print(lst)

 

1.4.3 字典、集合的迭代问题

  字典、集合在遍历时,如果改变原数据的size,则会造成迭代时报错。

同理:遍历时 对字典/集合 本身、浅拷贝、视图( 如 字典的dict.keys() )等做出修改也会影响迭代过程。

解决方法:深拷贝,然后迭代遍历。