2016-10-10 86 views
-1
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]] 
""" 
new_matrix = matrix[:] 
for row in new_matrix: 
    row += [0] 
return new_matrix 

Doctests返回原始矩阵将返回新的矩阵,我不知道如何克隆这个矩阵,而无需编辑原始。麻烦克隆一个矩阵

+0

您需要使用deepcopy –

回答

1

您正在制作外部列表的副本,但每个内部列表仍然相同。您需要使用不同的列表,而不是row修改它的:

new_matrix = [] 
for row in matrix: 
    new_matrix.append(row + [0]) 

这方面的一个浓缩版本是:

new_matrix = [row + [0] for row in matrix] 
1

问题就出现了,因为矩阵表示为列表的列表。声明new_matrix = matrix[:]制作“外部”列表的副本,但不会制作每一行的副本。你的实现也被称为浅拷贝。有关更详细的解释,请参阅this post

您可以按照zondo的建议实施add_column方法,使用copy模块创建深层副本或使用numpy。虽然使用numpy需要您了解一个新的库,但从长远来看,灵活性和计算效率是值得的。