乘法 table 函数无法正确追加

Multiplication table function won't append properly

当 n = 4 时,我希望乘法函数为 return:

[[1, 2, 3, 4],
 [2, 4, 6, 8],
 [3, 6, 9, 12],
 [4, 8, 12, 16]]

代码:

import numpy

def multiplication_table(n): 
    full_multi = [[]] * n 

    for i in range(n):
        for j in range(n):
            full_multi[i].append( (i+1)*(j+1) )

    list_as_array = numpy.array(full_multi)

    return list_as_array
print(multiplication_table(4))

相反,这是 returned(忽略格式):

[

[ 1  2  3  4  2  4  6  8  3  6  9 12  4  8 12 16]

[ 1  2  3  4  2  4  6  8  3  6  9 12  4  8 12 16]

[ 1  2  3  4  2  4  6  8  3  6  9 12  4  8 12 16]

[ 1  2  3  4  2  4  6  8  3  6  9 12  4  8 12 16]

]

我不知道哪里出了问题。感谢您的帮助!

尝试将 [[] * n] 更改为 [[] for _ n range(n)] ,如下所示:

import numpy

def multiplication_table(n): 
    full_multi = [[] for _ n range(n)] 

    for i in range(n):
        for j in range(n):
            full_multi[i].append((i+1)*(j+1))

    list_as_array = numpy.array(full_multi)

    return list_as_array
print(multiplication_table(4))

这会输出所需的

[[1, 2, 3, 4],
 [2, 4, 6, 8],
 [3, 6, 9, 12],
 [4, 8, 12, 16]]

这两个代码不同的原因在于复制(在本例中为乘法列表)的工作方式。通过执行 [[] * n],您实际上并没有创建 n 个不同的列表,而只是创建 [] 个列表的 n 个引用。

如果我们通过在 full_multi[i].append( (i+1)*(j+1)) 之后添加 print 语句来调试代码以打印 full_multi 的值,我们可以看到此行为:

[[1], [1], [1], [1], [1]]
[[1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]
...

向第一个列表添加一个值也会使其出现在其余列表中,因为它们都引用相同的数据。但是,for 循环方法实际上会创建 n 个单独的列表。

有关更多信息,请参阅 https://www.geeksforgeeks.org/copy-python-deep-copy-shallow-copy/

在 Python(或大多数语言)中复制列表(或任何非原始数据类型)时,您实际上并没有复制数据,而只是创建了一个新的引用。

a = 5
b = a  # for primitive data like integers, the value 5 is copied over
a = []
b = a  # only the reference to the list stored in 'a' is copied

a.append(5)
print(a, b)  # will both be the same value since they are the same list, just referenced by 2 different variables

如果您想实际复制列表本身,您必须执行类似以下操作:

a = []
b = a.copy()  # copies the list, not just the reference

a.append(5)
print(a, b)  # will both be different