Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python列表的不同初始化会为矩阵乘法提供不同的输出_Python_List_Matrix_Matrix Multiplication - Fatal编程技术网

为什么Python列表的不同初始化会为矩阵乘法提供不同的输出

为什么Python列表的不同初始化会为矩阵乘法提供不同的输出,python,list,matrix,matrix-multiplication,Python,List,Matrix,Matrix Multiplication,我尝试进行矩阵乘法,同时使用快捷方式C[[0]*列]*行初始化列表。 列表是按我的要求初始化的,但它给了我错误的答案。 在我尝试用for循环初始化代码之后,它给出了正确的答案。 请帮助我理解python列表行为背后的原因 这是我的代码: A = [[1,2],[3,4]] B = [[5,6,],[7,8]] C = [] for i in range(2): c = [] for j

我尝试进行矩阵乘法,同时使用快捷方式C[[0]*列]*行初始化列表。 列表是按我的要求初始化的,但它给了我错误的答案。 在我尝试用for循环初始化代码之后,它给出了正确的答案。 请帮助我理解python列表行为背后的原因

这是我的代码:

        A = [[1,2],[3,4]]
        B = [[5,6,],[7,8]]
        C = []
        for i in range(2):
            c = []
            for j in range(2):
              c.append(int(0))
            C.append(c)
        D = [[int(0)]*2]*2

        for i in range(len(A)):
          for j in range(len(B[0])):
              for k in range(len(B)):
                  C[i][j] += A[i][k] * B[k][j]
                  D[i][j] += A[i][k] * B[k][j]

        for r in C:
          print(r)
        print(D) 
这是我的输出:

        [[19, 22],[43, 50]]
        [[62, 72], [62, 72]]

原因可能是,在执行列表相乘的“快捷方式方法”时,Python不会对列表进行深度复制。请参见此示例:

d=[5*[2]]*3
>> [[2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2]]
d[0][0]=1
>> [[1, 2, 2, 2, 2], [1, 2, 2, 2, 2], [1, 2, 2, 2, 2]]
看起来我正要修改元素[0][0],但实际上其他行只是引用第一行-因此我更改了三行而不是一行


请考虑使用矩阵运算:<< /P>子代码列表>代码> d>代码>指向内存中相同的列表。见(谢谢)需要在不使用Numpy的情况下处理此问题。