问题描述
我想跟踪每次迭代中气泡排序算法的中间状态。我试图在循环运行时将它们缓存在字典中,但是我一直都保持相同状态
这是我的代码:
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)