【问题标题】:Manipulating list index value, What is wrong with this python code?操作列表索引值,这个 python 代码有什么问题?
【发布时间】:2020-02-05 04:51:58
【问题描述】:

我的意图是改变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]]

list2

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

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    那是因为您将列表本身附加到 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]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 2011-05-14
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多