Что произойдёт при изменении копии списка, созданной через срез?

Изменение копии списка, созданной через срез (например, new_list = original_list[:]), не затронет исходный список, если элементы списка являются неизменяемыми типами (например, числа, строки, кортежи). Однако, если список содержит изменяемые объекты (например, другие списки, словари), то изменение этих вложенных объектов повлияет на оба списка, так как срез создает только поверхностную копию.

При изменении копии списка, созданной с помощью среза (например, new_list = original_list[:]), исходный список original_list не будет изменен, если в списке хранятся неизменяемые объекты (например, числа, строки, кортежи).

Это связано с тем, что срез создает поверхностную копию списка. Это означает, что создается новый список, содержащий новые ссылки на те же самые объекты, которые были в исходном списке.

Если же в списке хранятся изменяемые объекты (например, другие списки, словари), то изменение этих вложенных объектов отразится и в исходном, и в скопированном списке. Потому что и исходный, и скопированный списки будут содержать ссылки на одни и те же изменяемые объекты.

Пример с неизменяемыми объектами:

    
      original_list = [1, 2, 3]
      copied_list = original_list[:]
      copied_list[0] = 4
      print(original_list)  # Вывод: [1, 2, 3]
      print(copied_list)    # Вывод: [4, 2, 3]
    
  

Пример с изменяемыми объектами:

    
      original_list = [[1, 2], [3, 4]]
      copied_list = original_list[:]
      copied_list[0][0] = 5
      print(original_list)  # Вывод: [[5, 2], [3, 4]]
      print(copied_list)    # Вывод: [[5, 2], [3, 4]]
    
  

В последнем примере изменение copied_list[0][0] меняет первый элемент первого вложенного списка. Поскольку и original_list и copied_list ссылаются на один и тот же вложенный список [1, 2] (в начале), то изменение отражается в обоих списках. Для создания глубокой копии, которая копирует все объекты рекурсивно, можно использовать функцию copy.deepcopy() из модуля copy.

0