为什么在以下代码中修改了我原来的2D数组

时间:2019-04-27 13:24:34

标签: python

我正在尝试解决一个编码问题,我必须生成一些矩阵,这是python的新手,我无法弄清楚为什么我的矩阵不断更改为正在生成的最新矩阵。这是我到目前为止的代码:

def mirrorHorizontal(m):
    l = list(m)
    matrix_len = len(l)
    for x in range(0,matrix_len):
        temp = l[x][matrix_len-1]
        l[x][matrix_len-1] = l[x][0]
        l[x][0] = temp
    return l

def mirrorVertical(m):
    l = list(m)
    matrix_len = len(l)
    for x in range(0,matrix_len):
        temp = l[0][x]
        l[0][x] = l[matrix_len-1][x] 
        l[matrix_len-1][x] = temp
    return l


def rotateMatrix(m):
    l = list(m)
    matrix_len = len(l)
    rotated_matrix = []
    for x in range(0,matrix_len):
        rotated_row = []
        for y in range(0, matrix_len):
            rotated_row.append([(matrix_len-1) -y][y])
        rotated_matrix.append(rotated_row)
    return rotated_matrix


# Complete the formingMagicSquare function below.
def formingMagicSquare(s):
    all_matrices = []
    base_matrix = [[8,3,4],[1,5,9],[6,7,2]]
    all_matrices.append(base_matrix)
    print("all matrices after first append",all_matrices)

    base_h_mirror = list(mirrorHorizontal(base_matrix))
    print("horizontal_mirror",base_h_mirror)
    all_matrices.append(base_h_mirror)
    print("all matrices after first h  mirror append",all_matrices)

    base_v_mirror = list(mirrorVertical(base_matrix))
    print("vertical_mirror",base_v_mirror)
    all_matrices.append(base_v_mirror)
    print("all matrices after first v mirror append",all_matrices)


    #Same as vertical mirror of horizontal mirror
    base_v_h_mirror = list(mirrorHorizontal(base_v_mirror))

    all_matrices.append(base_h_mirror)
    print("h_mirror added",all_matrices)

    all_matrices.append(base_v_mirror)
    print("h_mirror added",all_matrices)

    all_matrices.append(base_v_h_mirror)
    print("base_v_h_mirror added",all_matrices)

    print("mirrored matrices= ",all_matrices)

    matrix_len = len(all_matrices)
    for x in range(0,matrix_len):
        all_matrices.append(rotateMatrix(all_matrices[x]))

    print(all_matrices)

formingMagicSquare()

输出,如果运行则类似:

all matrices after first append [[[8, 3, 4], [1, 5, 9], [6, 7, 2]]]

horizontal_mirror [[4, 3, 8], [9, 5, 1], [2, 7, 6]]

all matrices after first h  mirror append
 [
[[4, 3, 8], [9, 5, 1], [2, 7, 6]],
 [[4, 3, 8], [9, 5, 1], [2, 7, 6]]
]
vertical_mirror [[2, 7, 6], [9, 5, 1], [4, 3, 8]]

all matrices after first v mirror append
 [[[2, 7, 6], [9, 5, 1], [4, 3, 8]], 
[[2, 7, 6], [9, 5, 1], [4, 3, 8]],
 [[2, 7, 6], [9, 5, 1], [4, 3, 8]]]

h_mirror added [[[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]]]
h_mirror added [[[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]]]
base_v_h_mirror added [[[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]]]
mirrored matrices=  [[[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]]]

为什么我的矩阵一次又一次地填充相同的矩阵?我通过将列表切成[:]

来将列表转换成所使用的函数

1 个答案:

答案 0 :(得分:1)

这也与mutable and immutable types有关。您正在处理列表列表,即可变列表。因此,即使您使用[:]进行浅拷贝:容器的副本,但如果引用是可变的,则保留对内部对象的引用,即使引用是通过内部引用传递的,也是如此。 br /> 这就是为什么当您更改内部列表时,每次都更改 same 内部列表的原因。它们都是对相同列表的引用。

请查看copy docs,以获取有关浅拷贝和深拷贝的更多详细信息。这也将为您提供解决方案:使用深层副本。

在每个函数中,替换:

l = list(m)

具有:

l = copy.deepcopy(m)