当我在Python 2.7.3中执行以下代码时:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class A(object):
def __init__(self):
self.s = []
class B(object):
def __init__(self):
self.a = A()
class C(object):
def __init__(self):
self.b = B()
c = C()
print c.b.a.s
c.b.a.s.append(1)
c.b.a.s.append(2)
c.b.a.s.append(3)
c.b.a.s.append(4)
c.b.a.s.append(5)
print c.b.a.s
for element in c.b.a.s:
print c.b.a.s.pop()
print c.b.a.s
我得到了输出:
[]
[1, 2, 3, 4, 5]
5
4
3
[1, 2]
但我希望for语句弹出列表中的所有元素,并将c.b.a.s保留为[]。
问题: 我省略了代码中的某些内容,或者pop()方法出了什么问题?
答案 0 :(得分:4)
在迭代时不应修改列表!
尝试
for _ in range(len(c.b.a.s)):
c.b.a.s.pop()
代替
答案 1 :(得分:0)
使用for循环迭代它时修改可迭代对象通常是个坏主意,除非你真正了解它的底层实现。而是使用循环结构,如下所示:
while len(c.b.a.s):
element = c.b.a.s.pop()
print element, c.b.a.s
答案 2 :(得分:0)
您知道,问题与您的班级结构无关。发生了什么是你如何使用流行音乐。由于您正在主动修改正在迭代的列表,因此当前迭代的内部索引最终将超过列表的实际大小,从而导致for循环退出。
如果你想使用pop清空列表,你应该找出运行pop的次数(即列表的大小)并多次运行它:
for el in xrange(len(c.b.a.s)):
c.b.a.s.pop()