Python удаление последнего индекса, не затрагивая другие списки - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть программа, в которой у меня есть 2 списка. Я хотел удалить последний индекс одного из этих списков, но столкнулся с проблемой, что способы, которые я пытался удалить, удаляют содержимое каждого списка.

Пример:

list1 = ["Index", "2nd Index"]
list2 = list1
print(list1 == list2) #Here it is true, as it should be.

del list1[-1]
print(list1 == list2) #Here is still true, which it shouldn't be.

Я пытался использовать del, .pop() и нарезки. Единственное решение, которое у меня есть, это сделать .txt файл и скопировать вставить первый список в него, а затем скопировать вставить все во второй список Но, безусловно, есть и другой, более простой способ, который не требует от меня создания текстового файла для написания полного раздела кода для вставки копий.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Краткий ответ:

Вместо list2 = list1, сделайте list2 = list1[:]


tl; dr

В python имя переменной просто некоторый указатель (не в смысле C), указывающий на фактический объект, который содержит значение переменной. Поэтому, когда вы делаете variable_1 = variable_2, у вас есть две переменные, указывающие на одну и ту же переменную. Вы можете увидеть это поведение из приведенного ниже примера

a = 5
b = a
print(id(a), id(b)) #same identity
print(a is b) #True

Если вы сделаете b = 10 позже, он создаст новый объект для b, а id(a) и id(b) больше не будут равны. То же самое касается списков.

l1 = [1,2,3]
l2 = l1
id(l1), id(l2) #same identity
l1 is l2 #True
l2 = [2,3,4] #assign a new list
id(l1), id(l2) #different identities
l1 is l2 #False

Но когда вы только меняете / удаляете ... et c. определенный индекс списка, тот же список обновляется. Вы не изменяете переменную list2

l2 = l1
l2.pop()
id(l1), id(l2) #same identity
l1 is l2 #True

Поэтому вам необходимо сделать копию первого списка. list2 = list1[:] делает это

0 голосов
/ 16 апреля 2020

У вас нет двух списков, у вас есть один список с двумя именами. Каждый раз, когда вы что-то делаете с list2, вы делаете это с list1, потому что они - один и тот же список.

Попробуйте сделать list2 a copy:

list1 = ["Index", "2nd Index"]
list2 = list1.copy()
print(list1 == list2) # Here it is true, what is totally fine now.

del list1[-1]
print(list1 == list2) # This is not true!
...