Python изменение и редактирование списков

#python #list

#python #Список

Вопрос:

Я только начинаю изучать python, я пробовал некоторый код, и я хотел спросить, почему два следующих кода функционируют по-разному?

Первый пример кода:

 def combine_lists(list1, list2):
  new_list = list2
  index = len(list2)
  for items in list1:
      new_list.insert(index, items)
  return(new_list)
    
Jamies_list = ["Alice", "Cindy", "Bobby", "Jan", "Peter"]
Drews_list = ["Mike", "Carol", "Greg", "Marcia"]

print(combine_lists(Jamies_list, Drews_list))
 

Вывод этого первого кода правильный (где я хочу, чтобы список 1 был перевернут):

[‘Майк’, ‘Кэрол’, ‘Грег’, ‘Марсия’, ‘Питер’, ‘Ян’, ‘Бобби’, ‘Синди’, ‘Алиса’]

Второй пример кода:

 def combine_lists(list1, list2):
  new_list = list2
  for items in list1:
      new_list.insert(len(list2), items)
  return(new_list)
    
Jamies_list = ["Alice", "Cindy", "Bobby", "Jan", "Peter"]
Drews_list = ["Mike", "Carol", "Greg", "Marcia"]

print(combine_lists(Jamies_list, Drews_list))
 

Но этот второй код выводит:

[‘Майк’, ‘Кэрол’, ‘Грег’, ‘Марсия’, ‘Алиса’, ‘Синди’, ‘Бобби’, ‘Ян’, ‘Питер’]

Почему существует разница в этих двух выходных данных, если просто присвоить переменной len(list2) и использовать ее для вставки индекса?

Спасибо!

Комментарии:

1. new_list = list2 не создает новый список.

Ответ №1:

Эта строка:

     new_list = list2
 

Просто создает новое имя для list2 списка, но обе переменные ссылаются на один и тот же список.

Итак, в первом примере вы получаете длину этого списка с index = len(list2) помощью, а затем используете одно и то же значение for index на каждой итерации цикла for .

Во втором примере вы получаете len(list2) для каждой итерации, но поскольку вы изменяете new_list , вы также изменяете list2 , и его длина будет увеличиваться по мере продвижения.

Если вам нужна копия списка, создайте копию с list(new_list) = list2 помощью или new_list = list2.copy()

Ответ №2:

Первый фрагмент кода


 def combine_lists(list1, list2):
  new_list = list2
  index = len(list2)
  for items in list1:
      new_list.insert(index, items)
      print(new_list)
  return(new_list)
    
Jamies_list = ["Alice", "Cindy", "Bobby", "Jan", "Peter"]
Drews_list = ["Mike", "Carol", "Greg", "Marcia"]

print(combine_lists(Jamies_list, Drews_list))
 

Вывод:

 ['Mike', 'Carol', 'Greg', 'Marcia', 'Alice']
['Mike', 'Carol', 'Greg', 'Marcia', 'Cindy', 'Alice']
['Mike', 'Carol', 'Greg', 'Marcia', 'Bobby', 'Cindy', 'Alice']
['Mike', 'Carol', 'Greg', 'Marcia', 'Jan', 'Bobby', 'Cindy', 'Alice']
['Mike', 'Carol', 'Greg', 'Marcia', 'Peter', 'Jan', 'Bobby', 'Cindy', 'Alice']
['Mike', 'Carol', 'Greg', 'Marcia', 'Peter', 'Jan', 'Bobby', 'Cindy', 'Alice']
 

Для вашего первого кода вы вставляете new_list.insert(index, items) каждый новый элемент в одну и ту же позицию в течение определенного периода ( len(list2) ) . Каждый раз, когда вы вставляете его, получаете тот же индекс, а последний элемент вставки перемещается на index 1 позицию, и именно поэтому кажется Jamies_list , что список вставляется в обратном порядке.

Второй фрагмент кода

Поскольку вы выделяете len(list2) каждый раз for loop , он динамически обновляет len и принимает новую позицию нового элемента