乘法 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
当 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