Python 为什么在下面的代码中修改我的原始二维数组

Python 为什么在下面的代码中修改我的原始二维数组,python,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]

我试图解决一个编码问题,在那里我必须生成一些矩阵,我是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]]]
为什么我的矩阵一次又一次地被同一个矩阵填充?我在使用的函数中对列表进行了转换,方法是将其切片
[:]

,这也与。您正在处理列表列表,即可变项列表。因此,内部列表是通过引用传递的,即使您使用的
[:]
是一个浅层副本:容器的副本,但如果它们是可变的,则保留对内部对象的引用。
这就是为什么,当您更改内部列表时,每次都在更改相同的内部列表。它们都是对相同列表的引用

请查看,以了解有关浅拷贝和深拷贝的更多详细信息。这也将为您提供一个解决方案:使用深度拷贝

在每个功能中,替换:

l = list(m)
与:


没有经过代码筛选
[:]
是一个浅显的副本,请提供一个示例。要通读所有代码是非常困难的。并提供错误发生的确切位置。@UliSotschok请仔细阅读以上代码。这是我能提供的最简单的代码示例,没有错误,我得到了上面描述的意外行为。谢谢!我试着用
list()
替换
[:]
,但没用,
copy.deepcopy()
起作用。
l = copy.deepcopy(m)