通过python中的迭代将列表附加到另一个列表

时间:2014-10-20 12:37:20

标签: python list python-3.x

所以,我一直试图用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中的每个实例都会被编辑。我有一个朋友大致解释说列表不是数据,而是一组数据的内存地址,这就是为什么这不起作用?

2 个答案:

答案 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]]