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

2019-08-18 23:47:19 +08:00
 Ctry
代码如下:
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]这几个元素并没有循环。这是为什么?求知道的大神告知,感谢感谢!
3000 次点击
所在节点    Python
11 条回复
Trim21
2019-08-18 23:53:57 +08:00
因为你在循环里把元素给删掉了
在循环前复制一份列表就好了
for i in nums[:]:
ipwx
2019-08-19 00:00:48 +08:00
for in 循环内部改变循环对象,在有些语言里面你连编译都过不去
limyel
2019-08-19 00:30:25 +08:00
而且建议代码贴在 ubuntu paste 上面看起来会比较方便一些
Ctry
2019-08-19 00:32:56 +08:00
@Trim21 多谢多谢,有点理解了。我删除了第一个元素,等到第二次循环的时候,程序把新列表的第一个元素(也就是旧列表的第二个元素)当作了刚才已经循环过的第一个元素,然后就跳过了。直接循环旧列表的第三个元素。这样的话就一直是间隔一个来循环了。
Ctry
2019-08-19 00:40:02 +08:00
@ipwx 好吧 肯定有更好的实现方法。我再研究一下。
Ctry
2019-08-19 00:41:08 +08:00
@limyel 好的 感谢提醒。我也感觉这样看起来贼难受。哈哈
guiqiqi
2019-08-19 05:13:55 +08:00
@Ctry 无耻安利一波,之前才入门的时候也遇到过这个问题,还做了比较详细的探究,希望对你有帮助: https://init.blog/archives/1350
ipwx
2019-08-19 09:35:35 +08:00
@Ctry 你这操作适合写 while i<len(nums),自己管理 i 是否要步进 1。这也是需要修改被遍历对象时的标准做法
Yggdroot
2019-08-19 10:07:58 +08:00
v2ex 不是支持 markdown 吗,代码贴成这样?
no1xsyzy
2019-08-19 12:30:12 +08:00
把这段用函数式写就不大可能写错
Ctry
2019-08-21 23:56:31 +08:00
@guiqiqi 感谢感谢!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/592980

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX