所以,我一直试图用python创建一个由乘法表组成的矩阵,最多n个。
我的功能是这样的:
def multiplicationTable(n):
tablePrint = []
tempTable = []
for s in range(n):
s += 1
tempTable.clear()
for r in range(n):
r += 1
tempTable.append(r*s)
tablePrint.append(tempTable)
# print(tablePrint)
return tablePrint
但是,返回的列表包含n个tempTable的n个版本。如果删除注释,则可以看到每次迭代时,tablePrint中的每个实例都会被编辑。我有一个朋友大致解释说列表不是数据,而是一组数据的内存地址,这就是为什么这不起作用?
答案 0 :(得分:1)
问题是您要将tempTable
对象重复附加到tablePrint
对象。因此,当您修改tempTable
时,还会修改tablePrint
中的所有实例。这称为 mutability ,在python列表中是可变的。并非python中的所有数据都是可变的,例如,如果tempTable
是一个字符串,那么您的方法将会起作用。
要解决可变数据的这个问题,只需附加一份副本:
tablePrint.append(tempTable[::])
这是一个小例子:
>>> a = [1,2,3]
>>> b = a
>>> a == b
True
>>> a is b
True #They are the same object, changing a will change b
>>> b = a[::]
>>> a == b
True
>>> a is b
False #They are no longer the same object!
您所遇到的问题的篇幅为here(略有不同)
答案 1 :(得分:0)
使用列表推导或嵌套for
循环会更简单。
def multiplicationTable(n):
return [[i*j for j in range(1,n+1)] for i in range(1,n+1)]
>>> multiplicationTable(3)
[[1, 2, 3],
[2, 4, 6],
[3, 6, 9]]
使用更多循序渐进的嵌套for
循环。
def multiplicationTable(n):
table = []
for i in range(1,n+1):
l = []
for j in range(1,n+1):
l.append(i*j)
table.append(l)
return table
>>> multiplicationTable(3)
[[1, 2, 3],
[2, 4, 6],
[3, 6, 9]]