При удалении элемента списка и смещении остальных элементов влево значение нулевого(по индексу) элемента не меняется
def f(l):
for i,v in enumerate(l):
print(i,v)
if i == 0:
l.remove(i)
print(l)
print(i,v)
l.append(i)
print(l)
l = [0,1,2,3]
print(f(l))
>>>
0 0
[1, 2, 3]
0 0
[1, 2, 3, 0]
1 2
2 3
3 0
None
Скажите, почему на первой итерации цикла после удаления первого элемента (0) список изменился а индекс и значение остались от прежнего элемента? Ведь, по идее, т.к. из-за смещения элементов влево произошла замена и теперь у нас нулевой (по индексу) элемент другой (1), что мы и видим принтуя список, значит и значение нулевого (по индексу) элемента должно измениться. Тем не менее, питон говорит, что значение не изменилось и использует это значение далее в коде. Спасибо!
Ответы (2 шт):
Потому что в цикле for будет храниться копия списка но не сам список, в итерации вы удаляете элемент из списка а в копии он остается. Чтобы это решить воспользуйтесь циклом while
Разберем по порядку ваш код.
Определяем функцию и пробегаемся по списку. В директиве for вы определяете две переменные i и v. Что буквально означает i - позиция в списке, v - значение (enumerate)
def f(l):
for i,v in enumerate(l):
print(i,v)
Так вот вопрос: когда данные переменные изменят свое значение? Ответ: тогда и только тогда, когда будут присвоены новые. Присвоение произойдет только в следующей итерации по for.
Далее пошагово:
...
if i == 0: # Позиция равна нулю? -> True
l.remove(i) # Удалить по значению (Важно!!!), а не по позиции.
# в данном случае у вас позиция и значения равны
print(l) # [1, 2, 3]
print(i,v) # переопределены переменные? нет! значит вывод этих
# переменных будет абслютно таким же как и в самом начале
# 0 0
l.append(i) # Добавить значение 0 (не позиция, а именно значение)
print(l) # [1, 2, 3, 0]
Это была первая (нулевая) итерация. Что же дальше? А ничего, будут меняться только значения переменных i и v и выводиться в консоль. Больше ни разу не сработают директивы под if