【问题标题】:When I append different lists to a list of lists, I get only the last list. Why?当我将不同的列表附加到列表列表时,我只得到最后一个列表。为什么?
【发布时间】:2017-12-03 17:54:07
【问题描述】:

我正在尝试记录与 python 标准函数追加/扩展等一起使用的过去列表组合的日志:

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 列表,在每次切换后它应该在循环结束时将列表附加到日志中,我应该打印所有使用的列表。

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

第一个列表是我应该如何,最后是现在的样子。

【问题讨论】:

    标签: python-3.x list stack


    【解决方案1】:

    我会尝试澄清一些误解。

    误解 1 - 列表是不可变的

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

    正确理解 - 列表是可变的

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

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

    你不是在创建一个新列表,你只是在修改同一个列表。

    阅读列表和可变性here

    问题如下 -

    您的日志列表最终将包含 多个same 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)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-14
      • 2020-08-29
      • 2020-08-04
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多