python - 为什么复制时我的原始嵌套列表会发生变化?

标签 python list

我正在尝试创建一个给定嵌套列表的函数,并删除 to_eliminate 中所有出现的元素。我明白为什么我会遇到这个问题 new_list = input_list ,但我在做new_list = input_list[:] 。我什至检查了他们的身份证,他们肯定是不同的。我不想修改我的原始列表。

这两段代码都不起作用。 当我同时返回input_list时和new_list ,我得到相同的结果。我不明白为什么,因为我复制了原始列表,并且它们是两个不同的对象。

最佳答案

你的根本问题是 input_list[:] 只有浅拷贝;如果它本身包含可变内容(在本例中为嵌套列表),则它会与可变数据共享别名,并且在“副本”中修改它仍然会修改原始数据结构。

如果您无法使用copy模块,并且您已经获得了已知的列表的二维排列,则只需自己执行深层复制,并更改:

new_list = input_list[:]

至:

new_list = [sublst[:] for sublst in input_list]

并确保返回new_list而不是input_list。该列表理解只是手动将列表第二层浅拷贝到一个全新的列表中。您可以将其进一步扩展到更高级别的嵌套,但越深入,它就会变得越来越荒谬。

真正的答案是让 Python 为您完成工作,使用 copy.deepcopy,使其:

new_list = copy.deepcopy(input_list)

无论您的数据结构嵌套有多深,它都会起作用。

关于python - 为什么复制时我的原始嵌套列表会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58811129/

相关文章:

python - Pandas read_csv中的日期时间dtypes

Python For...循环迭代

c# - 如何将 double 列表中的所有元素相乘?

python 和函数参数

python - python 中 timeit.timeit() 函数的拆解

python - 余弦相似度

Python Pandas - 查找两个数据帧之间的差异

vb.net - 如何更改类列表中的值?

html - 跨越列表到多行

list - Haskell - 如何计算嵌套列表中的元素