【问题标题】:Cannot make Python list copies to work [duplicate]无法使 Python 列表副本起作用 [重复]
【发布时间】:2026-01-31 21:50:01
【问题描述】:

当我尝试使用列表及其副本时遇到问题。我知道有某些方法可以在 Python 中复制列表,我认为我会遵循它们。这是我的问题。

a = []
for i in range(10):
    a.append([0]*10)

b = a[:]

for j in a:
    j[0] = 1

print a
print b

我创建了一个空白列表。然后我添加 10 个零子列表 ([0,0,0,0,0....])。然后我复制列表,最后遍历第一个。但是当我打印它们时,两个列表都已更改。

【问题讨论】:

    标签: python


    【解决方案1】:

    3 个选项:

    • 使用内置的list() 函数与生成器相结合

    b = list(list(item) for item in a)

    • 列表理解

    b = [item[:] for item in a]

    import copy b = copy.deepcopy(a)

    【讨论】:

    • b = [item for item in a] 似乎不起作用,而 b = [item[:] for item in a] - 正如下面的答案中所建议的那样 - 确实(使用 python 2.7)
    • 啊,对不起,是的,确实必须正确阅读问题,需要复制列表中的列表,而不是仅仅复制列表,更新
    【解决方案2】:

    另一种创建深拷贝的方法是使用copy模块的copy.deepcopy函数:doc

    【讨论】:

      【解决方案3】:

      要进行正确的复制,请使用copy 模块

      b = copy.deepcopy(a)
      

      【讨论】:

        【解决方案4】:

        您只创建了一个 副本。这将创建一个新列表,其中包含对所包含值的引用a 中的列表包含仍在ab 列表之间共享。

        您可以添加复制级别:

        b = [elem[:] for elem in a]
        

        这将创建一个新的列表对象,其中包含来自a 的嵌套列表的浅表副本。由于嵌套列表本身只包含不可变对象(整数),这就足够了。

        或者您可以使用copy.deepcopy() 让库函数为您执行此操作,通过递归遍历您的结构并创建任何可变内容的副本来创建副本。

        【讨论】: