复合语句是包含其它语句(语句组)的语句;它们会以某种方式影响或控制所包含其它语句的执行。 通常,复合语句会跨越多行,虽然在某些简单形式下整个复合语句也可能包含于一行之内。

if, while 和 for 语句用来实现传统的控制流程构造。

for 语句中执行 list 的 remove 操作时,会有一个很微妙的问题。如下:

【问题】

#示例1,会打印出 1 2 
a = [1,2,3,1,2,4,5]
for i in a:
a.remove(i)
for j in a:
if(i==j):
print(j)


#示例2,只会打印出 1
a = [1,2,3,1,4,2,5]
for i in a:
a.remove(i)
for j in a:
if(i==j):
print(j)

上述2个示例中,我们想要达到的预期效果是找出list a 中的重复元素。但是为什么示例1可以打印出2个重复元素,示例2只能打印出1个重复元素呢?

【分析】

Python 中 for 语句用于序列或其他可迭代对象中的元素进行迭代。

当序列在循环中被修改时会有一个微妙的问题(这只可能发生于可变序列例如列表中)。

会有一个内部计数器被用来跟踪下一个要使用的项,每次迭代都会使计数器递增,当计数器值达到序列长度时循环就会终止。

这意味着如果语句体从序列中删除了当前(或之前)的一项,下一项就会被跳过(因为其标号将变成已被处理的当前项的标号)。

类似地,如果语句体在序列当前项的前面插入一个新项,当前项会在循环的下一轮中再次被处理。

这会导致麻烦的程序错误,通常避免此问题的办法是对整个序列使用切片来创建一个临时副本

【参考解决】

# 对整个序列使用切片创建一个临时副本
a = [1,2,3,1,4,2,5]
for i in a[:]:
a.remove(i)
for j in a:
if(i==j):
print(j)

###【参考】
Python文档