Python 在迭代列表时更改该列表出现的问题

2018-12-29 15:43:13 +08:00
 jianzhao123

本人 python 菜鸟一枚,今天遇到了下面的问题。

for name in name_list:
    if len(name_list) != 0:
        name_list.pop(0)
        print(name_list)

运行结果

 /Users/xxx/PycharmProjects/work/work/test/test-1.py
['b', 'c', 'd']
['c', 'd']

Process finished with exit code 0

我断点 debug 后发现 for 循环第二次循环时 name 的值直接从 a 变为 c,跳过了 b,求各位讲下原因,还有就是如果想把一个列表重的元素通过循环删空该怎么写?

1564 次点击
所在节点    问与答
7 条回复
xpresslink
2018-12-29 15:57:26 +08:00
不能一迭代一删除列表,索引会变。
楼主既然用 python 就要用 python 的思维方式,不能还停留在 C 语言的模式。

list(set(name_list))就去重了。
>>> l = [2, 1, 2, 3]
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(l, None).keys())
[2, 1, 3]
>>>
pompeii
2018-12-29 15:59:54 +08:00
不要同时迭代和修改同一个列表。while(len(name_list)!=0)或者 while name_list,再 pop;直接 name_list=[]也达到效果了
ballshapesdsd
2018-12-29 16:01:00 +08:00
这个 name 是要做啥子呢,都没用到
jianzhao123
2018-12-29 16:28:50 +08:00
@pompeii 我已经改成 while 了,谢谢
jianzhao123
2018-12-29 16:29:19 +08:00
@ballshapesdsd 本来是做个例子,后来为了方便就改了😂😂
ClutchBear
2018-12-29 17:16:27 +08:00
不能在便利 list 的时候,
修改 list
jianzhao123
2018-12-29 18:44:43 +08:00
@ClutchBear 感谢。

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

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

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

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

© 2021 V2EX