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() )等做出修改也会影响迭代过程。

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

 

posted @ 2024-01-08 14:53  橘子葡萄火龙果  阅读(8)  评论(0编辑  收藏  举报