学习 Python 遇到一个问题

for name in guest_list:
    if len(guest_list) > 2:
        print('{}'.format(len(guest_list)))
        print('Sorry {}'.format(guest_list.pop()))
6
Sorry Jobs
5
Sorry Append
4
Sorry John

这里为什么剩 3 个就跳出循环了?


学习 Python 遇到一个问题

20 回复

pop 是移除列表最后一个元素的方法


我无法理解你的问题

但是现在剩的是三个啊

哦,我明白了,看了一下 for 的定义,计数器正好是长度了,所以跳出循环了。https://docs.python.org/3/reference/compound_stmts.html#the-for-statement

试了一下,没问题啊?

如果我想就 pop 到剩 2 个元素应该用什么方法好呢?

你把元素改成 6 个试试

你可能需要 while True 吧

还真是哈,from 从前往后,pop 从后往前.到中间就结束了

换成 while 就好了

pop()是去掉 list 里最后一个元素,并且返回这个元素的值。六个元素循环了三次就只剩三个,所以就跳出循环了



换成 while 可以了,还是得看官方文档啊。书上只说了 for 会遍历每一个元素,没说有个计数器和长度做比较。

我感觉#8 那个更简洁,我当时只想着要把每个元素打印出来用了 for 所以出错了。

注意:千万不要在遍历列表的同时对列表做增删操作。

#8 的好,我的 while True 写多余了。

https://gist.github.com/bwangel23/760f71119323e1f989477a083ca28381

参考 for-iter.py 文件。

关于迭代器和 for 循环的说明参考 雨痕的 《 Python 学习笔记》

另外,我在看 C++ 中的迭代器的时候,《 C++ Primer 》中说不建议在对迭代器进行迭代的时候,更改底层的被迭代的对象,因为这样很容易访问到已经被删除的对象,让程序崩溃退出。

Python 中我还没看到过哪里有说明 迭代过程中修改被迭代的对象会让程序崩溃。但是不推荐这么写,因为这样写的代码不容易理解,容易让阅读者混乱。

不要在迭代的时候修改序列本身,会发生很多微妙的事情。增加和删除都有问题。
这点在 python 官方文档 for 语法部分有明确说明的。

不要在迭代的时候修改被迭代的对象

我只知道在迭代的时候修改被迭代的对象是在作死

回到顶部