V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jadeity
V2EX  ›  Python

学习 Python 遇到一个问题

  •  
  •   jadeity · 2018-04-17 19:27:40 +08:00 · 3705 次点击
    这是一个创建于 2405 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 个就跳出循环了?

    19 条回复    2018-04-18 14:28:11 +08:00
    jimmyczm
        1
    jimmyczm  
       2018-04-17 19:48:51 +08:00   ❤️ 1
    pop 是移除列表最后一个元素的方法
    jadeity
        2
    jadeity  
    OP
       2018-04-17 19:52:21 +08:00
    @jimmyczm 但是现在剩的是三个啊
    jadeity
        3
    jadeity  
    OP
       2018-04-17 20:01:02 +08:00
    @jimmyczm 哦,我明白了,看了一下 for 的定义,计数器正好是长度了,所以跳出循环了。https://docs.python.org/3/reference/compound_stmts.html#the-for-statement
    rabbbit
        4
    rabbbit  
       2018-04-17 20:02:36 +08:00
    试了一下,没问题啊?
    jadeity
        5
    jadeity  
    OP
       2018-04-17 20:03:40 +08:00
    @jimmyczm 如果我想就 pop 到剩 2 个元素应该用什么方法好呢?
    jadeity
        6
    jadeity  
    OP
       2018-04-17 20:05:40 +08:00
    @rabbbit 你把元素改成 6 个试试
    co3site
        7
    co3site  
       2018-04-17 20:09:49 +08:00 via Android   ❤️ 1
    你可能需要 while True 吧
    rabbbit
        8
    rabbbit  
       2018-04-17 20:14:45 +08:00   ❤️ 1
    还真是哈,from 从前往后,pop 从后往前.到中间就结束了

    换成 while 就好了
    whoami9894
        9
    whoami9894  
       2018-04-17 20:17:11 +08:00 via Android
    pop()是去掉 list 里最后一个元素,并且返回这个元素的值。六个元素循环了三次就只剩三个,所以就跳出循环了
    jadeity
        11
    jadeity  
    OP
       2018-04-17 20:21:30 +08:00
    @co3site
    @rabbbit
    换成 while 可以了,还是得看官方文档啊。书上只说了 for 会遍历每一个元素,没说有个计数器和长度做比较。
    jadeity
        12
    jadeity  
    OP
       2018-04-17 20:25:19 +08:00
    @bwangel 我感觉#8 那个更简洁,我当时只想着要把每个元素打印出来用了 for 所以出错了。
    Kilerd
        13
    Kilerd  
       2018-04-17 20:44:08 +08:00
    注意:千万不要在遍历列表的同时对列表做增删操作。
    bwangel
        14
    bwangel  
       2018-04-17 20:51:00 +08:00
    @jadeity #8 的好,我的 while True 写多余了。

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

    参考 for-iter.py 文件。

    关于迭代器和 for 循环的说明参考 雨痕的 《 Python 学习笔记》
    bwangel
        15
    bwangel  
       2018-04-17 20:54:52 +08:00
    另外,我在看 C++ 中的迭代器的时候,《 C++ Primer 》中说不建议在对迭代器进行迭代的时候,更改底层的被迭代的对象,因为这样很容易访问到已经被删除的对象,让程序崩溃退出。

    Python 中我还没看到过哪里有说明 迭代过程中修改被迭代的对象会让程序崩溃。但是不推荐这么写,因为这样写的代码不容易理解,容易让阅读者混乱。
    Ge4Los
        16
    Ge4Los  
       2018-04-17 22:58:08 +08:00
    不要在迭代的时候修改序列本身,会发生很多微妙的事情。增加和删除都有问题。
    这点在 python 官方文档 for 语法部分有明确说明的。
    shamashii
        17
    shamashii  
       2018-04-18 10:57:46 +08:00
    qianc1990
        18
    qianc1990  
       2018-04-18 11:17:27 +08:00
    不要在迭代的时候修改被迭代的对象
    gnozix
        19
    gnozix  
       2018-04-18 14:28:11 +08:00
    我只知道在迭代的时候修改被迭代的对象是在作死
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2923 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:31 · PVG 22:31 · LAX 06:31 · JFK 09:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.