当我将不同的列表附加到列表列表时,我只得到最后一个列表。为什么?

时间:2017-12-03 17:54:08

标签: python-3.x list stack

我试图保留与python标准函数append / extend等一起使用的过去列表组合的日志:

log = [[(3, 23), (5, 7), (6, 14), (3, 0), (11, 24), (3, 5), (20, 19), (16, 9), (19, 5)]]
counter = 0
switch = False

while switch == False:
    counter += 1

    if counter > 5:
        switch = True

    lenth = len(log)
    netlist = log[0]

    index = netlist.index((11, 24))

    tmp = netlist[index - 1]
    netlist[index - 1] = netlist[index]
    netlist[index] = tmp
    print(netlist)

    log.append(netlist)


print()
for lists in log:
    print(lists)

结果应该是一个包含切换后所有使用列表的日志变量。因此,在日志中使用de list进行监视,并且在每次切换之后,它应该在循环结束时将列表附加到日志中,我应该打印所有使用的列表。

我得到的结果是一个包含所有相同列表的日志(最后一个使用的列表)。 First list is how it should me last is how it is now.

第一个清单是我现在应该如何现在。

1 个答案:

答案 0 :(得分:1)

我会尝试清除一些误解。

误解1 - 列表是不可变的

  

我得到的结果是一个包含所有相同列表的日志(最后一个使用的列表)。

正确理解 - 列表是可变的

使用以下代码交换列表中的值时 -

tmp = netlist[index - 1]
netlist[index - 1] = netlist[index]
netlist[index] = tmp

您没有创建新列表,只是修改了相同的列表。

了解列表和可变性here

问题,如下所示 -

您的日志列表最终会包含对相同 list对象的多个引用。

所以情况会是这样的。

         __________________________________________________
        |                  netlist                         |
        |                                                  |
        |                  value -                         |
        |  [(3, 23), (5, 7), (6, 14), (3, 0),              |
        |   (11, 24), (3, 5), (20, 19), (16, 9), (19, 5)]  |
        |                                                  |
        |                                                  |
        |                                                  |
        |_____^________________^______________^____________|
        ______|________________|______________|_________________
       |      |                |              |                 |
       |   ___|_____       ____|_____     ____|_____            |
       |  |         |     |          |   |          |           |
       |  |   0     |     |    1     |   |    2     |           |
       |  |_________|     |__________|   |__________|  ........ |
       |                                                        |
       |                  log                                   |
       |________________________________________________________|

在这里您可以看到0th索引引用与1st索引,2nd索引相同的元素,等等。

您可能想要的是log包含多个不同的列表。

像这样 -

         _____________     ____________     _____________
        |             |   |            |   |             |
        | [(3, 23),   |   |  another   |   | yet another |
        |   (5, 7)...]|   |    list    |   | list        |
        |             |   |            |   |             |
        |             |   |            |   |             |
        |_____^_______|   |____^_______|   |____^________| .......
        ______|________________|________________|_______________
       |      |                |                |               |
       |   ___|_____       ____|_____       ____|_____          |
       |  |         |     |          |     |          |         |
       |  |   0     |     |    1     |     |    2     |         |
       |  |_________|     |__________|     |__________| ....... |
       |                                                        |
       |                  log                                   |
       |________________________________________________________|

因此,当您尝试打印日志时,您获得的是一次又一次打印的相同列表。

解决方法是使用:运算符复制初始列表。

阅读如何复制列表here

误解2 - 使用0选择最后一个元素。

正确理解 - 使用-1获取最后一个元素。

这段代码 -

netlist = log[0]

建议您尝试选择列表的最后一个元素,但使用索引0

要获取列表中的最后一个元素,请使用索引-1

了解切片表示法here

最终守则 -

log = [[(3, 23), (5, 7), (6, 14), (3, 0), (11, 24), (3, 5), (20, 19), (16, 9), (19, 5)]]
counter = 0
switch = False

while switch == False:
    counter += 1

    if counter > 5:
        switch = True

    # lenth = len(log) Commenting this line as it's not needed
    netlist = log[-1][:]

    index = netlist.index((11, 24))

    tmp = netlist[index - 1]
    netlist[index - 1] = netlist[index]
    netlist[index] = tmp
    # print(netlist)

    log.append(netlist)

# Remove 1st element of log if you don't need it.
log = log[1:]
print()
for lists in log:
    print(lists)

这将打印出您期望的以下输出。

[(3, 23), (5, 7), (6, 14), (11, 24), (3, 0), (3, 5), (20, 19), (16, 9), (19, 5)]
[(3, 23), (5, 7), (11, 24), (6, 14), (3, 0), (3, 5), (20, 19), (16, 9), (19, 5)]
[(3, 23), (11, 24), (5, 7), (6, 14), (3, 0), (3, 5), (20, 19), (16, 9), (19, 5)]
[(11, 24), (3, 23), (5, 7), (6, 14), (3, 0), (3, 5), (20, 19), (16, 9), (19, 5)]
[(19, 5), (3, 23), (5, 7), (6, 14), (3, 0), (3, 5), (20, 19), (16, 9), (11, 24)]
[(19, 5), (3, 23), (5, 7), (6, 14), (3, 0), (3, 5), (20, 19), (11, 24), (16, 9)]