2012-05-18 3 views
1

В списке Python запись, которую я ожидал удалить, осталась, а другая запись была удалена. Почему это?Почему скрипт Python перескакивает через некоторые записи, а не другие?

Вот проблемный код:

def getAdjacent(pos, bounds): 
    posibles = [ 
    [pos[0]-1, pos[1]], 
    [pos[0]+1, pos[1]], 
    [pos[0], pos[1]-1], 
    [pos[0], pos[1]+1]] 
    for p in posibles: 
     if isOutside(p,bounds): 
      posibles.remove(p) 
    return posibles 


def isOutside(pos, bounds): 
    if pos[0] > bounds[0]-1 or pos[0] < 0 or pos[1] < 0 or pos[1] > bounds[1]-1: 
     return True 
    else: 
     return False 

Вот некоторые входы и выходы, которые отражают эту проблему:

In [13]: bounds = [10, 10] 

In [14]: p = [9,0] 

In [15]: getAdjacent(p, bounds) 
Out[15]: [[8, 0], [9, -1], [9, 1]] 

In [16]: isOutside([9, -1], bounds) 
Out[16]: True 

In [17]: isOutside([9, 1], bounds) 
Out[17]: False 

Теперь, почему [9, -1] еще в getAdjacent(), когда getAdjacent () удаляет все элементы, вызывающие isOutside() для извлечения True? И почему еще нет [10, 0]? Это вещь великая?

ответ

8

Не удалять элементы из списков вы будете итерация:

for p in posibles: 
    if isOutside(p,bounds): 
     posibles.remove(p) 

Это путает итерацию и приводит к пропуску записей. Я бы написал это как

possibles = [p for p in possibles if not isOutside(p, bounds)] 
+0

ах, я вижу :). спасибо allot (и спасибо за орфографическую коррекцию тоже :)) – user1003620

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