我的目的是更改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]]