鱼C论坛

 找回密码
 立即注册
查看: 2656|回复: 9

[已解决]求助:关于列表 pop()方法的使用

[复制链接]
发表于 2021-6-1 17:42:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:

name = ['lili', 'lilian', 'lisa', 'rose']

name.insert(0, 'bob')
name.insert(4, 'summer')
name.append('apple')

print(name)

for each in name:
    print(name.pop(), ', I am sorry')

运行结果如下:

['bob', 'lili', 'lilian', 'lisa', 'summer', 'rose', 'apple']
apple , I am sorry
rose , I am sorry
summer , I am sorry
lisa , I am sorry
['bob', 'lili', 'lilian']

疑惑:

为啥列表中 还保存三个元素  不应该是全部删除了吗?????
最佳答案
2021-6-2 12:11:46
happy_zl 发表于 2021-6-2 11:35
for each in name:
这句代码咋理解
我之前理解的是 遍历name 列表中的所有元素


for 按照下标取出元素

比如若此时已经循环到第三个元素,那么此时索引下标为 2 (因为从 0 开始索引),下个循环时索引下标就为 3

此时若索引值未超过 可迭代对象总长度,那么循环会继续进行

而此时若你将索引为 0 元素删去,会导致列表中后续元素索引值都减 1,但你循环索引的下标还是为 3 所以导致 for 循环“漏了” 新索引值为 2 的元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-1 17:45:10 | 显示全部楼层
for each in name  遍历时有惰性

改成for each in name[:]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-1 18:54:23 | 显示全部楼层
name = ['lili', 'lilian', 'lisa', 'rose']

name.insert(0, 'bob')
name.insert(4, 'summer')
name.append('apple')

print(name)

for each in range(len(name)):
    print(name.pop(), ', I am sorry')
我觉得你是想做到这个效果吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-1 18:58:41 | 显示全部楼层

你 for 循环过程中,name 列表被循环时,内部的元素被移除

而 for 循环的索引值不会改变,依旧照就循环的索引直到 for 循环 name 列表索引超出 name 列表长度,则退出循环

这也就导致循环过程中,有些元素因元素进出而改变的索引值而未被 for 循环遍历到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-6-1 20:19:27 | 显示全部楼层
['bob', 'lili', 'lilian', 'lisa', 'summer', 'rose', 'apple']

当for循环 循环到lisa 后,lisa 被删除,然后继续第五次循环时,pop()函数发现第五次循环没有找到删除的值,程序终止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-2 11:35:42 | 显示全部楼层
Twilight6 发表于 2021-6-1 18:58
你 for 循环过程中,name 列表被循环时,内部的元素被移除

而 for 循环的索引值不会改变,依旧照就循 ...

for each in name:
这句代码咋理解
我之前理解的是 遍历name 列表中的所有元素
但是现在感觉好像不是哎
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-2 12:11:46 | 显示全部楼层    本楼为最佳答案   
happy_zl 发表于 2021-6-2 11:35
for each in name:
这句代码咋理解
我之前理解的是 遍历name 列表中的所有元素


for 按照下标取出元素

比如若此时已经循环到第三个元素,那么此时索引下标为 2 (因为从 0 开始索引),下个循环时索引下标就为 3

此时若索引值未超过 可迭代对象总长度,那么循环会继续进行

而此时若你将索引为 0 元素删去,会导致列表中后续元素索引值都减 1,但你循环索引的下标还是为 3 所以导致 for 循环“漏了” 新索引值为 2 的元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-2 12:11:47 | 显示全部楼层
pop()函数不指定index是从-1开始的,就是从最后开始
name = ['lili', 'lilian', 'lisa', 'rose']

name.insert(0, 'bob')
name.insert(4, 'summer')
name.append('apple')

print(name)

# for each in range(len(name)):
#     print(name.pop(), ', I am sorry')
print('+'*100)
for each in name:
    print(each)
    print(name.pop(), ', I am sorry')
    print('被删除的name:',name)
    print('-'*20)
print('+'*100)












代码运行结果:
['bob', 'lili', 'lilian', 'lisa', 'summer', 'rose', 'apple']
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bob
apple , I am sorry
被删除的name: ['bob', 'lili', 'lilian', 'lisa', 'summer', 'rose']
--------------------
lili
rose , I am sorry
被删除的name: ['bob', 'lili', 'lilian', 'lisa', 'summer']
--------------------
lilian
summer , I am sorry
被删除的name: ['bob', 'lili', 'lilian', 'lisa']
--------------------
lisa
lisa , I am sorry
被删除的name: ['bob', 'lili', 'lilian']
--------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


吐槽下不能复制图片上传啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-4 16:54:49 | 显示全部楼层
pop()不是弹出并允许使用吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-13 17:52:29 From FishC Mobile | 显示全部楼层
pop()是默认删除最后一位的,然后你for是遍历当前列表的长度,前面下标在增加,你列表的长度又在变小,所以你遍历的不是一个完整的列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 13:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表