如何保留字典交换元素后的副本?swap_elements函数结果异常排查
解决字典元素交换后快照保存异常的问题
嘿,我太懂你遇到的这个坑了!你写的swap_elements函数本来想每次交换字典里的元素后存个快照,结果最后所有保存的条目全变回原字典了对吧?这其实是Python可变对象的引用特性在搞鬼。
问题原因分析
Python里的字典、列表都是可变对象,当你执行modified_grids_1.update({"entry "+str(i): grid})时,并没有把当前grid的内容复制一份存进去,而是存了一个指向这个grid对象的引用。后面你把元素交换回原状态时,所有引用指向的都是同一个grid对象,所以最后所有entry里的内容自然都跟着变回原样了。
解决方案:使用深拷贝保存快照
因为你的grid里的值是列表(也是可变对象),所以必须用深拷贝来创建完全独立的副本,而不是浅拷贝。我们可以借助Python内置的copy模块里的deepcopy方法来实现。
修改后的完整代码
import copy def swap_elements(grid, new_positions, current_x_y): modified_grids_1 = {} i = 0 for pos in new_positions: # 执行元素交换 grid[pos[0]][pos[1]], grid[current_x_y[0]][current_x_y[1]] = grid[current_x_y[0]][current_x_y[1]], grid[pos[0]][pos[1]] # 保存当前grid的深拷贝作为快照 modified_grids_1[f"entry {i}"] = copy.deepcopy(grid) i += 1 # 交换回原状态,保证下一次循环的初始状态正确 grid[current_x_y[0]][current_x_y[1]], grid[pos[0]][pos[1]] = grid[pos[0]][pos[1]], grid[current_x_y[0]][current_x_y[1]] return modified_grids_1
测试验证
现在调用你给出的示例:
swap_elements({0: [1, 2], 1: [3, 4]}, [(0, 1), (1, 0)], (0, 0))
会得到你期望的正确结果:
{'entry 0': {0: [2, 1], 1: [3, 4]}, 'entry 1': {0: [3, 2], 1: [1, 4]}}
内容的提问来源于stack exchange,提问作者Samiul Mushfik
相关产品推荐
相关产品推荐

