В Python условия в цикле переоцениваются перед выполнением новой итерации? - PullRequest
3 голосов
/ 17 марта 2019

Что касается python, когда речь заходит о цикле for, будет ли он переоценивать верхнюю границу перед повторной итерацией?

Скажем, у меня есть следующий сценарий:

def remove(self,list,element):
     for x in range(0,len(list)):
           if somecondition:
               list.pop(x)

Будет ли пересмотрено условие len(list) перед выполнением следующей итерации цикла for?(Как и в некоторых языках, таких как Objective-C, я считаю) Как и в противном случае, если количество элементов выталкивается, возникает ошибка вне границ, если, скажем, 1 элемент был удален, и последняя итерация будет пытаться получить доступ к list[len(list)-1].

Я пытался исследовать это сам, однако результаты каждый раз запутаны.

Редактировать : Я считаю, что мой вопрос отличается от вопроса, помеченного как дубликат, поскольку мой вопрос касается условия продолжения цикла до следующей итерации, он может легкодобавление элемента вместо удаления элемента.

Для пояснения, мой вопрос спрашивает, будет ли условие цикла for перепроверять условия, заданные перед следующей итерацией.

Ответы [ 3 ]

5 голосов
/ 17 марта 2019

Документация о Оператор for ясно говорит об этом:

Оператор for используется для итерации по элементам последовательности (таким как строка, кортеж илиlist) или другой повторяемый объект:

for_stmt :: = "for" target_list "в" expression_list ":" suite ["else" ":" suite]

Список выраженийоценивается один раз ;это должно привести к повторяемому объекту.Итератор создается для результата expression_list.Затем набор выполняется один раз для каждого элемента, предоставленного итератором, в порядке, возвращаемом итератором.

[выделение шахты]

Итак, в вашем случае, range(0,len(list))будет оцениваться только один раз.

1 голос
/ 17 марта 2019

Да, вы можете увидеть ошибку out of range, если попытаетесь выполнить следующее:

my_list = [0,1,2,3,4,5]
for x in range(0, len(my_list)):
    print("Length of my_list:", len(my_list))
    my_list.pop(x)

(Вам также следует избегать использования имени переменной, например list, поскольку оно будет скрывать встроенный в Python list.)

0 голосов
/ 17 марта 2019

Рассмотрим следующий код:

i = 3

def test():
  global i ;
  i = i + 1
  return i

for x in range(0,test()):
  print( x, i )

Каждый раз, когда test() is called i is incremented, so the loop woul be endless if test () `оценивались на каждой итерации.Выходные данные, однако, следующие:

0 4
1 4
2 4
3 4

Очевидно, что test() оценивается один раз.

...