请大佬们问一个关于 for 循环的问题! - V2EX
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 3345 次点击
    这是一个创建于 2250 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码如下:
    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     Solana     1073 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 23:07 PVG 07:07 LAX 16:07 JFK 19:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86