2013-04-08 2 views
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] 

Но я ожидаю, для оператора pop все элементы в списке и оставить cbas как [].

Вопрос: Я пропустил что-то в коде или что-то не так в методе pop()?

+2

Try 'для г в range (len (cbas)) 'вместо –

ответ

4

вы не должны изменять список, как вы его повторяете!

попробовать

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

вместо

+0

Что вы думаете о инструкции цикла, например [this] (http://ideone.com/dQc7IM)? –

+0

Я бы ожидал, что это сбой, поскольку значение истины непустого массива неоднозначно ... meh или, может быть, im, чтобы это ... –

+1

Истинные значения не являются двусмысленными! См. [This] (http://docs.python.org/2/library/stdtypes.html) –

0

Изменения итерации объекта в то время как итерация его, используя для цикла, как правило, плохая идея, если вы не понимаете, лежащая в его основе реализации. Вместо этого используйте петлевую конструкцию, такую ​​как:

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

это будет работать менее чем оптимально, так как len нужно перекомпилировать каждый цикл ... –

+0

'len' в этом случае не нужно, так как список будет оцениваться _True_ если не пусто, поэтому 'while cbas:' работает с той же скоростью, что и для _ для _ в xrange (len (cbas)): '. Однако вызов len', кажется, всего на 25% медленнее. – mtadd

+0

im not sure thats always true ... Im sure Ive получил сообщения об ошибках об истинном значении непустого массива, который не определен, однако я не уверен, в каких случаях это происходит ... –

0

Просто, чтобы вы знали, проблема не имеет ничего общего с вашей структурой класса. То, что происходит, - это то, как вы используете поп. Поскольку вы активно изменяете список, который вы повторяете, внутренний индекс текущей итерации в конечном итоге превысит фактический размер списка, заставив цикл for выйти.

Если вы хотите очистить список с помощью поп-музыки, вы должны выяснить, сколько раз, чтобы запустить поп (т.е. размер списка) и запустить его, что много раз:

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

 Смежные вопросы

  • Нет связанных вопросов^_^