python列表中的pop()方法无法正常工作

时间:2013-04-08 19:36:16

标签: python list pop built-in

当我在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()方法出了什么问题?

3 个答案:

答案 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()