Странное поведение при изменении списка на месте с помощью логических значений во время цикла for

Решая упражнение на питоне, я столкнулся со странным поведением цикла for, которого не понимаю.

move_zeros(array) должен переместить все нули массива в его конец.

def move_zeros(array):
        for x in array:
                if  x == 0 and x is not False:
                        array.remove(x)
                        array.append(x)

        return array

Он отлично работает для массивов со всеми типами элементов, но если массив содержит False, результат неверен:

move_zeros([1,2,0,1,0,1,0,3,0,1]) => [ 1, 2, 1, 1, 3, 1, 0, 0, 0, 0 ] (правильно!)

но

move_zeros([0, 1, False, False]) => [1, False, 0, 0] (неверно!)


person Andrej Z.    schedule 02.08.2019    source источник
comment
но это работает для первого False   -  person Andrej Z.    schedule 02.08.2019
comment
при циклическом просмотре копии массива он работает так, как ожидалось: for x in array.copy():   -  person Andrej Z.    schedule 02.08.2019


Ответы (1)


def move_zeros(array):
    new_arr = []
    nulls = []
    for x in array:
      if x:
        new_arr.append(x)
      else:
        nulls.append(x)
    return new_arr + nulls  

Пожалуйста, не меняйте объект, через который вы проходите...

person ruslan_krivoshein    schedule 02.08.2019