Всем привет. Изучаю основы Python и в задаче по оптимизации пузырькового алгоритма сортировки столкнулся с тем, что правильный на первый взгляд код выдавал не до конца отсортированный список. Вот сам код:
a = [3, 2, 4, 1, 9, 6, 5, 7]
swap = True
for i in range(len(a) - 1):
if swap == False:
break
for j in range(len(a) - i - 1):
x1, x2 = a[j], a[j + 1]
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
swap = True
else:
swap = False
print(a)
Методом тыка я выяснил, что в предпоследней строке после 'else:' надо оставить только False, а 'swap =' убрать. Получилось так:
a = [3, 2, 4, 1, 9, 6, 5, 7]
swap = True
for i in range(len(a) - 1):
if swap == False:
break
for j in range(len(a) - i - 1):
x1, x2 = a[j], a[j + 1]
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
swap = True
else:
False
print(a)
Всё работает. Но, в чём разница я не понимаю. На 14-м шаге (смотрю на pythontutor) правильный код после строки if a[j] > a[j + 1]: идёт на новый цикл, а не правильный идёт на 12-ю строку и меняет значение переменной swap на False.
Собственно вопрос мой следующий: в чём по сути заключается разница между этими двумя вариантами? Мне на первый взгляд казалось, что после else: естественно писать swap = False, ведь мы присваиваем переменной новое значение, значит, она (переменная) должна быть указана слева от знака присвоения, а фактически программа работает только без указания там самой переменной. Понимаю, что упустил что-то важное, но что, не могу додуматься.