list.append()如何在Python中工作 - 我得到了意想不到的结果

时间:2017-04-29 08:21:31

标签: python list append

我在下面编写了以下代码,但它的输出并不像我预期的那样。有谁知道它为什么会这样?

N.B。:我知道代码没有正确转换列表 - 我在编写函数时偶然发现了这种奇怪的行为。

matrix = [
     [1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
 ]

transposed = []
for i in range(4):
    print("i", i)
    t_list = []
    for row in matrix:
        print("row", row)
        t_list.append(row[i])
        print("t_list**********", t_list)
        transposed.append(t_list)

        print("transposed//////////////", transposed)

我希望第一行末尾的这个函数的输出是:

[[1], [1, 5], [1, 5, 9]]

相反,它似乎输出:

[[1, 5, 9], [1, 5, 9], [1, 5, 9]]

有谁知道为什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

这似乎是transposed.append(t_list)行中的缩进问题:

transposed = []
for i in range(4):
    t_list = []
    for row in matrix:
        t_list.append(row[i])

    transposed.append(t_list)

此代码打印:

[[1, 5, 9],
 [2, 6, 10],
 [3, 7, 11],
 [4, 8, 12]]

Transpose已在numpy中实现,它适用于python数组:

import numpy as np
np.transpose(matrix)

答案 1 :(得分:0)

问题在于:

t_list = []
for row in matrix:
    t_list.append(row[i])
    transposed.append(t_list)

在循环内部,列表对象t_list的内容发生了变化,但是 列表对象本身保持不变。因此,transposed获得相同的对象 对于每一行。

通过附加当前列表的副本而不是原始列表来修复此问题 列表对象。

transposed.append(list(t_list))

答案 2 :(得分:0)

关键是制作内部列表的副本,然后附加在外部列表中。

  

copy = t_list [::]

这是因为list是一个对象而且是一个refresnce。因此,当您在列表中追加另一个项目时,它将在该对象所在的所有位置更新。在您的情况下,您将列表附加到列表中,然后更新内部列表,这也会导致先前的列表项更新。您需要在transposed列表中附加列表副本。这是一个解决方案。

transposed = []
for i in range(4):
print("i", i)
t_list = []
for row in matrix:
    print("row", row)
    t_list.append(row[i])
    print("t_list**********", t_list)
    transposed.append(t_list[::])

    print("transposed//////////////", transposed)
相关问题