【问题标题】:The slice does not copy the list items, but the link to the list切片不复制列表项,而是复制到列表的链接
【发布时间】:2020-11-12 03:48:41
【问题描述】:
matrix_a = [[5, 0.9, 0.3, 0.2],
        [0.2, 8, 0.7, 0.5],
        [1, 0.3, 5.5, 0.4],
        [0.2, 0.5, 0.7, 6]]
 matrix_d = [7,
        9,
        -5,
        6]
def kramer_method(matrix, solution, determinant):

for i in range(4):
    temp_matrix = matrix[:]
    for t in range(4):
        temp_matrix[t][i] = solution[t]
    print(temp_matrix)
print(id(temp_matrix) == id(matrix))
return
kramer_method(matrix_a,matrix_d,determinant)

结果:

[[7, 0.9, 0.3, 0.2], [9, 8, 0.7, 0.5], [-5, 0.3, 5.5, 0.4], [6, 0.5, 0.7, 6]]
[[7, 7, 0.3, 0.2], [9, 9, 0.7, 0.5], [-5, -5, 5.5, 0.4], [6, 6, 0.7, 6]]
[[7, 7, 7, 0.2], [9, 9, 9, 0.5], [-5, -5, -5, 0.4], [6, 6, 6, 6]]
[[7, 7, 7, 7], [9, 9, 9, 9], [-5, -5, -5, -5], [6, 6, 6, 6]]
False

问题是:为什么temp_matrix列表没有在循环开始时取原始矩阵值?

【问题讨论】:

    标签: python list loops copy


    【解决方案1】:

    获取列表的一部分确实会复制列表。它执行所谓的浅拷贝。这意味着虽然temp_matrix 是原始列表的副本,但它不会复制元素。所以如果你做了类似temp_matrix.append([1,2,3]) 的事情,它不会改变matrix。由于它不复制元素,因此如果您修改其中一个temp_matrix[0].append(5),它将同时修改temp_matrixmatrix,因为它正在修改内部未复制的列表。

    您想要做的是使用copy 模块。具体来说,您需要import copy,而不是使用temp_matrix = matrix[:],而是使用temp_matrix = copy.deepcopy(matrix)。那个关于复制模块的页面还解释了更多关于深层副本需要什么比你原来的浅层副本。

    【讨论】:

    • 但是这种浅拷贝是否会发生,因为我的“矩阵”列表中有列表?因为如果我使用简单的元素列表进行切片,它将以正确的方式工作而无需复制地址。非常感谢您的回答!
    • 确切地说,当您对列表进行切片时,它不会复制元素,只是对它们的引用。数字无法更改,因此您不会注意到仅使用数字或字符串列表或其他不可变元素的列表。但是当您复制列表时,它们可能会发生变化,因此当您修改其中一个时您会注意到这个问题。祝你的项目好运!
    • @GeorgeGray 它总是无论类型如何都以相同的方式工作,只是某些类型是不可变的,因此它们无法更改
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多