0

当我在 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 语句会弹出列表中的所有元素并将 cbas 保留为 []。

问题: 我在代码中省略了某些内容,还是 pop() 方法有问题?

4

3 回答 3

4

您不应该在迭代列表时修改它!

尝试

for _ in range(len(c.b.a.s)):
    c.b.a.s.pop() 

反而

于 2013-04-08T19:39:30.347 回答
0

正如您所知,问题与您的班级结构无关。发生的事情是你如何使用流行音乐。由于您正在积极修改您正在迭代的列表,因此当前迭代的内部索引最终将超过列表的实际大小,从而导致 for 循环退出。

如果你想使用 pop 清空一个列表,你应该找出运行 pop 的次数(即列表的大小)并运行它多次:

for el in xrange(len(c.b.a.s)):
   c.b.a.s.pop()
于 2013-04-08T19:50:13.067 回答
0

除非您真正了解其底层实现,否则在使用 for 循环对其进行迭代时修改可迭代对象通常是一个坏主意。相反,请使用如下循环构造:

while len(c.b.a.s):
    element = c.b.a.s.pop()
    print element, c.b.a.s
于 2013-04-08T19:40:53.543 回答