首页 > 解决方案 > 操作列表索引值,这个python代码有什么问题?

问题描述

我的意图是改变list1的索引值;list1 更改了值,但在两个不同的位置,而不仅仅是一个。list2 做了我想要对列表 1 做的事情。

list1 = []
list2 = [[[40], 70], [[[40], 70], 90]]


def append_values():

    amount = None

    if len(list1) == 0:
        amount = 70
        list1.append([[40],amount])
    else:
        amount = 90
        list1.append([list1[-1],amount])



def alter_lists():

    print('ori: ', list1) #Orginal list
    list1[1][0][1] = "alt"
    print('alt: ', list1)   #Altered list

    print('\n')

    print('ori: ', list2) #Orginal list
    list2[1][0][1] = 'alt'
    print('alt: ', list2)  #Altered list


append_values()
append_values()
alter_lists()

输出:

列表1

   ori:  [[[40], 70], [[[40], 70], 90]]
   alt:  [[[40], 'alt'], [[[40], 'alt'], 90]]

清单2

ori:  [[[40], 70], [[[40], 70], 90]]
alt:  [[[40], 70], [[[40], 'alt'], 90]]

标签: python-3.x

解决方案


那是因为您将列表本身附加到if块中。因此,当您在块中更改附加列表时,else它会更改对原始列表的所有引用。你需要的是一个深拷贝,如下:

import copy

list1 = []
list2 = [[[40], 70], [[[40], 70], 90]]


def append_values():
    amount = None


    if len(list1) == 0:
        amount = 70
        list1.append([[40],amount])

    else:
        amount = 90
        l = copy.deepcopy(list1)
        list1.append([l[-1],amount])



def alter_lists():

    print('ori: ', list1) #Orginal list
    list1[1][0][1] = "alt"
    print('alt: ', list1)   #Altered list

    print('\n')

    print('ori: ', list2) #Orginal list
    list2[1][0][1] = 'alt'
    print('alt: ', list2)  #Altered list


append_values()
append_values()
alter_lists() 

给出:

ori:  [[[40], 70], [[[40], 70], 90]]
alt:  [[[40], 70], [[[40], 'alt'], 90]]


ori:  [[[40], 70], [[[40], 70], 90]]
alt:  [[[40], 70], [[[40], 'alt'], 90]]

推荐阅读