操作列表索引值,这个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]]

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

最新更新