Копирование списка

We use cookies. Read the Privacy and Cookie Policy

Часто разработчик берет существующий список и создает на его основе совершенно новый. Посмотрим, как работает копирование списков, и рассмотрим одну ситуацию, в которой копирование списка может принести пользу.

Чтобы скопировать список, создайте срез, включающий весь исходный список без указания первого и второго индекса ([:]). Эта конструкция создает срез, который начинается с первого элемента и завершается последним; в результате создается копия всего списка.

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

foods.py

(1) my_foods = ['pizza', 'falafel', 'carrot cake']

(2)friend_foods = my_foods[:]

print("My favorite foods are:")

print(my_foods)

print(" My friend's favorite foods are:")

print(friend_foods)

В точке (1) создается список блюд с именем my_foods. В точке (2) создается другой список с именем friend_foods. Чтобы создать копию my_foods, программа запрашивает срез my_foods без указания индексов, и мы сохраняем копию в friend_foods.

При выводе обоих списков становится видно, что они содержат одинаковые данные:

My favorite foods are:

['pizza', 'falafel', 'carrot cake']

My friend's favorite foods are:

['pizza', 'falafel', 'carrot cake']

Чтобы доказать, что речь в действительности идет о двух разных списках, добавим новое блюдо в каждый список:

my_foods = ['pizza', 'falafel', 'carrot cake']

(1) friend_foods = my_foods[:]

(2)my_foods.append('cannoli')

(3)friend_foods.append('ice cream')

print("My favorite foods are:")

print(my_foods)

print(" My friend's favorite foods are:")

print(friend_foods)

В точке (1) исходные элементы my_foods копируются в новый список friend_foods, как было сделано в предыдущем примере. Затем в (2) каждый список добавляется новый элемент: 'cannoli' в my_foods, и 'ice cream' в friend_foods. После этого вывод двух списков наглядно показывает, что каждое блюдо находится в соответствующем списке.

My favorite foods are:

(4)['pizza', 'falafel', 'carrot cake', 'cannoli']

My friend's favorite foods are:

(5)['pizza', 'falafel', 'carrot cake', 'ice cream']

Вывод в точке (1) показывает, что элемент 'cannoli' находится в списке my_foods, а элемент 'ice cream' в этот список не входит. В точке (5) видно, что 'ice cream' входит в список friend_foods, а элемент 'cannoli' в этот список не входит. Если бы эти два списка просто совпадали, то их содержимое уже не различалось бы. Например, вот что происходит при попытке копирования списка без использования среза:

my_foods = ['pizza', 'falafel', 'carrot cake']

# This doesn't work:

(1) friend_foods = my_foods

my_foods.append('cannoli')

friend_foods.append('ice cream')

print("My favorite foods are:")

print(my_foods)

print(" My friend's favorite foods are:")

print(friend_foods)

Вместо того чтобы сохранять копию my_foods в friend_foods в точке (1) , мы задаем friend_foods равным my_foods. Этот синтаксис в действительности сообщает Python, что новая переменная friend_foods должна быть связана со списком, уже хранящимся в my_foods, поэтому теперь обе переменные связаны с одним списком. В результате при добавлении элемента 'cannoli' в my_foods этот элемент также появляется в friend_foods. Аналогичным образом элемент 'ice cream' появляется в обоих списках, хотя на первый взгляд он был добавлен только в friend_foods. Вывод показывает, что оба списка содержат одинаковые элементы, а это совсем не то, что требовалось:

My favorite foods are:

['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']

My friend's favorite foods are:

['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']

примечание

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

Упражнения

4-10. Срезы: добавьте в конец одной из программ, написанных в этой главе, фрагмент, который делает следующее.

• Выводит сообщение «The first three items in the list are:», а затем использует срез для вывода первых трех элементов из списка.

• Выводит сообщение «Three items from the middle of the list are:», а затем использует срез для вывода первых трех элементов из середины списка.

• Выводит сообщение «The last three items in the list are:», а затем использует срез для вывода последних трех элементов из списка.

4-11. Моя пицца, твоя пицца: начните с программы из упражнения 4-1. Создайте копию списка с видами пиццы, присвойте ему имя friend_pizzas. Затем сделайте следующее.

• Добавьте новую пиццу в исходный список.

• Добавьте другую пиццу в список friend_pizzas.

• Докажите, что в программе существуют два разных списка. Выведите сообщение «My favorite pizzas are:», а затем первый список в цикле for. Выведите сообщение «My friend’s favorite pizzas are:», а затем второй список в цикле for. Убедитесь в том, что каждая новая пицца находится в соответствующем списке.

4-12. Больше циклов: во всех версиях foods.py из этого раздела мы избегали использования цикла for при выводе для экономии места. Выберите версию foods.py и напишите два цикла for для вывода каждого списка.