题目:将list1内元素移动到list2,最后list1为空。
# 我的代码:
list1=["c++","java","python","sql","javascript"]
list2=[]
for i in range(len(list1)):
a=list1.pop()
list2.append(a)
print("list1=",list1)
print("list2=",list2)
运行结果: (暂且不管顺序)
list1= []
list2= ['javascript', 'sql', 'python', 'java', 'c++']
我想知道for in过程中发生了什么,于是加了几行print
list1=["c++","java","python","sql","javascript"]
list2=[]
for i in range(len(list1)):
print(i)
print(len(list1))
print(range(len(list1)))
print("__ __ __ __ __ __ __ __\n")
a=list1.pop()
list2.append(a)
print("list1=",list1)
print("list2=",list2)
# 结果:
0
5
range(0, 5)
__ __ __ __ __ __ __ ___
1
4
range(0, 4)
__ __ __ __ __ __ __ ___
2
3
range(0, 3)
__ __ __ __ __ __ __ ___
3
2
range(0, 2)
__ __ __ __ __ __ __ ___
4
1
range(0, 1)
__ __ __ __ __ __ __ ___
list1= []
list2= ['javascript', 'sql', 'python', 'java', 'c++']
i / len(list1) / range(len(list1))同时变化:
遍历 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
i | 0 | 1 | 2 | 3 | 4 |
len(list1) | 5 | 4 | 3 | 2 | 1 |
range(len(list1)) | range(0, 5) | range(0, 4) | range(0, 3) | range(0, 2) | range(0, 1) |
i 是从range(len(list1))中逐次取值的,那么应该在第4次就取不到值然后截止了—— i=3 & range(len(list1))=range(0, 2) 是矛盾的啊~
for i in 表达式x
这里的表达式只在循环开始时演算一次相当于
把
存成
test.py
执行
python -m dis test.py
会得到字节码如下:
这里简化一下, for 循环编译后,分成二阶段执行,一个是SETUP_LOOP,一个是FOR_ITER:
循环第二阶段是在
46 FOR_ITER
~JUMP_ABSOLUTE 46
这两条之间进行,不会再对初始化代码的运行,但循环本身是围绕迭代变量进行的(上面的 range的结果[0,1,2,3,4]),如果这个变量本身发生了变化,自然会影响到循环的.