Изучаем Python | страница 52
foods.py
(1) my_foods = ['pizza', 'falafel', 'carrot cake']
(2)friend_foods = my_foods[:]
print("My favorite foods are:")
print(my_foods)
print("\nMy 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("\nMy 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("\nMy 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. Вывод показывает, что оба списка содержат одинаковые элементы, а это совсем не то, что требовалось: