如何在python中正确复制列表

问题描述

我想跟踪每次迭代中气泡排序算法的中间状态。我试图在循环运行时将它们缓存在字典中,但是我一直都保持相同状态

这是我的代码

def bubblesort(lst):
    cache = {}
    # Swap the elements to arrange in order
    iter = 0
    for iter_num in range(len(lst)-1,-1):
        new_lst = lst
        for idx in range(iter_num):
            iter += 1
            if new_lst[idx]>new_lst[idx+1]:
                new_lst[idx],new_lst[idx+1] = new_lst[idx+1],new_lst[idx]
            cache[f'iter{iter}'] = new_lst
    return cache

以下是输出

{'iter1': [50,119,194,365,608,788,851,879,960],'iter2': [50,'iter3': [50,'iter4': [50,'iter5': [50,'iter6': [50,'iter7': [50,'iter8': [50,'iter9': [50,'iter10': [50,...}

如您所见,它每次都会输出排序列表。我在这里想念什么?

解决方法

问题是,与线 cache[f'iter{iter}'] = new_lst 高速缓存字典中的对象以及new_list变量都指向同一对象。 在下一次互动中 new_lst = lst 用一个新对象覆盖它,现在缓存lst和new_list指向同一个对象。 您需要做的是创建对象的“真实”副本。为此,您可以使用copy软件包。 您还应该阅读shallow and deep copy之间的区别,因为它们非常基础,如果无法正确理解,则会带来许多问题。

from copy import copy
[...]
cache[f'iter{iter}'] = copy(new_lst)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...