Python中修改sim变量引发history变量改变的问题及解决方法
解决Python嵌套列表拷贝后同步修改的问题
你遇到的是Python中浅拷贝导致的引用问题。list(history[0])只是对外层列表做了一层拷贝,里面的每个子列表(比如[1]、[2])还是和history里的子列表指向同一个内存对象,所以修改sim[0]时,history里对应的子列表也会跟着变。
下面提供两种可行的解决办法:
方法1:列表推导式手动深拷贝(适合两层嵌套场景)
通过列表推导式对每个子列表也执行一次拷贝,切断子列表的引用关联:
history = [[[1],[2],[3],[4],[5]]] sim = [list(item) for item in history[0]] sim[0].append(5) print(history) # 输出:[[[1], [2], [3], [4], [5]]] print(sim) # 输出:[[1, 5], [2], [3], [4], [5]]
方法2:使用copy模块的deepcopy(通用嵌套场景)
如果你的列表嵌套层数更深,copy.deepcopy可以递归拷贝所有层级的对象,彻底断开所有引用:
import copy history = [[[1],[2],[3],[4],[5]]] sim = copy.deepcopy(history[0]) sim[0].append(5) print(history) # 输出:[[[1], [2], [3], [4], [5]]] print(sim) # 输出:[[1, 5], [2], [3], [4], [5]]
内容的提问来源于stack exchange,提问作者prince888
相关产品推荐
相关产品推荐

