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
Ctry
V2EX  ›  Python

请大佬们问一个关于 for 循环的问题!

  •  
  •   Ctry · 2019-08-18 23:47:19 +08:00 · 3000 次点击
    这是一个创建于 1956 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码如下:
    def total(nums, target):
    num_copy = tuple(nums)
    print(num_copy)
    index = []
    for i in nums:
    another_num = target-i
    nums.remove(i)
    if another_num in nums:
    ele = (i, another_num)
    for j in ele:
    index.append(num_copy.index(j))
    return index


    print(total([2, 7, 11, 6, 3, 15, 16, 17], 9))


    问题是:循环这个列表:[2, 7, 11, 6, 3, 15, 16, 17]的时候,为什么没有所有元素都循环到? debug 模式显示只循环了[2, 11, 3, 16]这几个元素。而[7,6,15,17]这几个元素并没有循环。这是为什么?求知道的大神告知,感谢感谢!
    11 条回复    2019-08-21 23:56:31 +08:00
    Trim21
        1
    Trim21  
       2019-08-18 23:53:57 +08:00 via Android
    因为你在循环里把元素给删掉了
    在循环前复制一份列表就好了
    for i in nums[:]:
    ipwx
        2
    ipwx  
       2019-08-19 00:00:48 +08:00 via Android
    for in 循环内部改变循环对象,在有些语言里面你连编译都过不去
    limyel
        3
    limyel  
       2019-08-19 00:30:25 +08:00
    而且建议代码贴在 ubuntu paste 上面看起来会比较方便一些
    Ctry
        4
    Ctry  
    OP
       2019-08-19 00:32:56 +08:00
    @Trim21 多谢多谢,有点理解了。我删除了第一个元素,等到第二次循环的时候,程序把新列表的第一个元素(也就是旧列表的第二个元素)当作了刚才已经循环过的第一个元素,然后就跳过了。直接循环旧列表的第三个元素。这样的话就一直是间隔一个来循环了。
    Ctry
        5
    Ctry  
    OP
       2019-08-19 00:40:02 +08:00
    @ipwx 好吧 肯定有更好的实现方法。我再研究一下。
    Ctry
        6
    Ctry  
    OP
       2019-08-19 00:41:08 +08:00
    @limyel 好的 感谢提醒。我也感觉这样看起来贼难受。哈哈
    guiqiqi
        7
    guiqiqi  
       2019-08-19 05:13:55 +08:00 via iPhone   ❤️ 1
    @Ctry 无耻安利一波,之前才入门的时候也遇到过这个问题,还做了比较详细的探究,希望对你有帮助: https://init.blog/archives/1350
    ipwx
        8
    ipwx  
       2019-08-19 09:35:35 +08:00 via Android
    @Ctry 你这操作适合写 while i<len(nums),自己管理 i 是否要步进 1。这也是需要修改被遍历对象时的标准做法
    Yggdroot
        9
    Yggdroot  
       2019-08-19 10:07:58 +08:00
    v2ex 不是支持 markdown 吗,代码贴成这样?
    no1xsyzy
        10
    no1xsyzy  
       2019-08-19 12:30:12 +08:00
    把这段用函数式写就不大可能写错
    Ctry
        11
    Ctry  
    OP
       2019-08-21 23:56:31 +08:00 via iPhone
    @guiqiqi 感谢感谢!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5642 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:47 · PVG 14:47 · LAX 22:47 · JFK 01:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.