Python 列表内元素转移到另一个,自己写的却不明白为何
题目:将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) 是矛盾的啊~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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]),如果这个变量本身发生了变化,自然会影响到循环的.我的问题栏太乱了,所以我把一些东西写在这,希望帮助我的朋友看这里。
求助了几个论坛,目前只有咱这个站有热心前辈帮忙,但也许是我提问水平有限,我还是一头雾水,于是在朋友提醒下去stackoverflow看了看,由于英文很差,用google翻译磕磕绊绊的发了贴。
也许是时差,答复的很快,有个人特意解释了一篇。
由于我的英文太烂,只读出一个信息:len()函数就是本质与list1不同的! list1在for in 循环中每次都会变动,所以遍历起来会不完整; 而len()函数就是有一个特征——在for in循环中第一次执行就定型,不论在循环中如何更改,i 只会在循环初始的len()函数中遍历.
我不知道译文是否正确,我理解是否到位,但好像也只能这样了。
谢谢 Yujiaao 的帮助,感谢。
唉~ 还是感叹,自学真的很多坑。