Порядок присваивания в пайтон

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

У меня в консоль выводится только самое последнее изменение несколько раз. Почему так происходит? Как мне исправить эту ошибку, чтоб выводилась вся история?

def bubble_sort(colors):                                                                                      
    # Сюда записываем историю сортировки и исходные значения                                                  
    history = []                                                                                              
    history.append(colors)                                                                                    
    # Сортировка пузырьком                                                                                    
    for i in range(len(colors) - 1):                                                                          
        for j in range(len(colors) - 1):                                                                      
            if colors[j] < colors[j + 1]:                                                                     
                # Обмен значений                                                                              
                colors[j], colors[j + 1] = colors[j + 1], colors[j]                                           
            history.append(colors)                                                                            

    return history                                                                                            

def main():                                                                                                   

    colors = [0x33, 0x23, 0x22, 0x44, 0xFF]                                                                   
    result = bubble_sort(colors)                                                                              
    # Вывод на экран всей истории                                                                             
    for i in range(len(result)):                                                                              
        print(result[i])                                                                                      

main()

Ответы (1 шт):

Автор решения: Эникейщик

Почему так происходит: в history добавляются не значения списка colors, а ссылка на сам список. По сути там хранится одно и тоже несколько раз. Это можно увидеть, выводя на экран history в каждой итерации.

Как исправить: заменить

history.append(colors)

на

history.append(colors.copy())

PS. Вместо

for i in range(len(result)):                                                                              
    print(result[i])

в питоне используется

for i in result:                                                                              
    print(i)

И старайтесь не давать переменным имена из одной буквы. Даже num или index намного понятней, чем просто i.

→ Ссылка