2013-04-08 138 views
0

當我在Python 2.7.3執行以下代碼:pop()方法在Python列表方法不能正常工作

#!/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()方法中出了錯?

+2

嘗試'因爲我範圍(len(cbas))'而不是 – 2013-04-08 19:38:31

回答

4

您不應該在迭代它時修改列表!

嘗試

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

代替

+0

您如何看待像[this]這樣的循環語句(http://ideone.com/dQc7IM)? – 2013-04-08 19:51:51

+0

我期望它會失敗,因爲非空數組的真值非常模糊...... meh或者可能會讓它變成...... – 2013-04-08 20:39:21

+1

真理值並不含糊!參見[this](http://docs.python.org/2/library/stdtypes.html) – 2013-04-08 21:06:40

0

修改一個迭代的對象,同時使用一個for循環通常是一個壞主意,除非你真的瞭解它的底層實現迭代它。相反,使用循環構造,如下所示:

while len(c.b.a.s): 
    element = c.b.a.s.pop() 
    print element, c.b.a.s 
+0

這會執行得不夠理想,因爲len需要重新計算每個循環... – 2013-04-08 20:40:27

+0

在這種情況下'len'是不必要的,因爲列表將評估爲_True_如果不爲空,那麼'while cbas:'的運行速度與'for xrange(len(cbas)):'中的速度大致相同。然而,調用len的速度似乎只有25%。 – mtadd 2013-04-08 20:50:06

+0

即時通訊不知道這總是真的...我確定我得到了關於非空數組的真值未定義的錯誤消息,但我不知道在哪些情況下失敗... – 2013-04-08 20:53:21

0

只是你知道,問題與你的類結構無關。發生的事情是你如何使用流行音樂。由於您正在修改正在迭代的列表,因此當前迭代的內部索引最終將超出列表的實際大小,導致for循環退出。

如果要清空使用彈出一個列表,你應該找出多少次運行POP(即列表的大小),然後運行它,很多時候:在

for el in xrange(len(c.b.a.s)): 
    c.b.a.s.pop()