You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保留字典交换元素后的副本?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:45:25