List 如何在Python中克隆嵌套列表?

List 如何在Python中克隆嵌套列表?,list,for-loop,python-2.7,clone,List,For Loop,Python 2.7,Clone,我正在阅读“如何像计算机科学家一样思考:使用Python第二版文档学习”。最后是练习11,它要求你 编写Python代码以通过doctest 我最初的解决办法是: def add_column(matrix): """ >>> m = [[0, 0], [0, 0]] >>> add_column(m) [[0, 0, 0], [0, 0, 0]] >>> n = [[3, 2], [5, 1], [4, 7]] >

我正在阅读“如何像计算机科学家一样思考:使用Python第二版文档学习”。最后是练习11,它要求你 编写Python代码以通过doctest

我最初的解决办法是:

def add_column(matrix):
"""
  >>> m = [[0, 0], [0, 0]]
  >>> add_column(m)
  [[0, 0, 0], [0, 0, 0]]
  >>> n = [[3, 2], [5, 1], [4, 7]]
  >>> add_column(n)
  [[3, 2, 0], [5, 1, 0], [4, 7, 0]]
  >>> n
  [[3, 2], [5, 1], [4, 7]]
"""
result = matrix[:]
for index in range(len(matrix)):
    result[index] += [0]
return result


if __name__ == "__main__":
    import doctest
    doctest.testmod()
然而,这段代码没有通过第二次测试。我将for循环的主体更改为以下内容:

result[index] = result[index] + [0]
代码现在通过了所有测试。但我不明白代码中的这个变化是如何解决这个问题的。我认为
result[index]=result[index]+[0]
result[0]+=[0]
的显式形式,那么为什么行为会有所不同呢

将我的答案与解决方案中提供的代码进行比较后,我怀疑问题可能在于我是如何克隆列表的。在解决方案中,它是这样做的:
result=[d[:]对于矩阵中的d]
,在这种情况下,我的初始for循环将起作用。但是为什么
result=matrix[:]
不起作用呢?它是在创建别名,而不是新对象吗


另外,有人能解释一下如何解析
[d[:]for d in matrix]
以及何时使用这种语法吗?我以前没有见过使用for循环的这种方法,课程中也没有对其进行解释/演示。

由于以下原因,列表没有被克隆:

result = matrix[:]
确实复制了清单;但您尚未复制列表项。Python通过引用处理列表项,因此
result[0]
matrix[0]
仍将指向相同的列表对象,即使
result
matrix
是不同的列表

[d[:]对于矩阵中的d]
克隆主列表和列表元素,因为它在
矩阵上迭代,并在新列表中创建每个元素的副本(而不是使用对该元素的引用)

您还可以使用
copy
模块,该模块特别有用,因为它也可以处理DICT,使用
copy.deepcopy
您可以克隆深度未知的多维列表:(但如果这超出了您在这里尝试学习的范围,就足够了)

至于“+=”和“=…+…”之间的区别,我承认我也有点惊讶。在这种情况下,我倾向于使用
result[index].append(0)
,这样可以避免这种歧义;但这当然不是答案