Проблема : Если вы назначаете объект списка к новой переменной, используя new_list
, любая модификация на new_list
изменения Old_List
Отказ Какова причина этого и как вы можете клонировать или копировать Список Чтобы предотвратить эту проблему?
Пример : Давайте рассмотрим следующий пример.
old_list = ['Alice', 'Bob', 'Carl'] new_list = old_list new_list.append(42) print(old_list) # ['Alice', 'Bob', 'Carl', 42]
Добавление элемента к new_list
также модифицирует оригинальный список Old_List
Отказ Таким образом, Old_List
Сейчас четыре элемента – даже если вы не изменили его напрямую.
Объяснение
Эта проблема одновременно модифицирования «двух» списков возникает, потому что у вас нет двух списков, но только один.
В Python все это объект. Вы создаете новый объект списка [«Алиса», «Боб», «Карл»]
которые проживают в памяти вашей машины. Обе имена переменной new_list
и Old_List
Укажите на тот же объект в памяти – если вы измените один, вы также измените другое!
Следующий интерактивный инструмент визуализирует память, используемую интерпретатору Python, при выполнении этого конкретного фрагмента кода:
Упражнение : Визуализируйте, как возникает проблема, нажав «Далее».
Вы понимаете источник проблемы? Отлично, давайте погрузимся в решения, начиная с краткого обзора!
Обзор решения
Вы можете увидеть все три решения, обсуждаемые в этом руководстве в нашей интерактивной оболочке Python:
Упражнение : Измените исходный список. Все три метода все еще создают одинаковый выход?
Далее вы узнаете о каждом методе более подробно!
Метод 1: нарезка
Самый простой способ создания неглубокой копии списка Python – это нарезка:
# Method 1: Slicing old_list = ['Alice', 'Bob', 'Carl'] new_list = old_list[:] new_list.append(42) print(new_list) # ['Alice', 'Bob', 'Carl']
Операция нарезки Old_List [:]
Создает новый список, поэтому переменные new_list
и Old_List
Теперь укажите разные объекты в памяти. Если вы измените один, другой не меняется.
Это способ с наименьшим количеством персонажей и многие кодера Python рассмотрит этот самую пиктонскую. Если вы хотите узнать больше о нарезке, посмотрите следующее видео и погрузитесь в подробное руководство в блоге.
Соответствующее руководство : Введение в нарезку в Python
Метод 2: копия
Альтернатива – использовать list.copy ()
Метод, который создает неглубокую копию списка.
# Method 2: Copy old_list = ['Alice', 'Bob', 'Carl'] new_list = old_list.copy() new_list.append(42) print(old_list) # ['Alice', 'Bob', 'Carl']
list.copy ()
Метод копирует все Список
элементы в новый список. Новый список – это возвращаемое значение метода. Это неглубокая копия – вы копируете только ссылки на объект на элементы списка, а не сами объекты.
Результат такой же, как метод нарезки: у вас есть две переменные, указывающие на два разных объекта списка в памяти.
Вы можете узнать больше о list.copy ()
Метод в моем подробном руководстве в блоге и следующем видео:
Похожие учебники: Python List.Copy () [Ultimate Guide]
Способ 3: Понимание списка
Третий способ решить проблему двух списков, указывающих на тот же объект в памяти, является способом понимания списка для создания новых списков.
# Method 3: List Comprehension old_list = ['Alice', 'Bob', 'Carl'] new_list = [x for x in old_list] new_list.append(42) print(old_list) # ['Alice', 'Bob', 'Carl']
Понимание списка является компактным способом создания списков. Простая формула – [Выражение + контекст]
Отказ
- Выражение: Что делать с каждым элементом списка?
- Контекст: Какие элементы для выбора? Контекст состоит из произвольного количества
для
иЕсли
заявления.
Вы можете наблюдать за учебным пособием видео и читать через связанную статью в блоге, чтобы узнать больше об этом!
Похожие учебники: Введение в список в списке
Куда пойти отсюда?
Достаточно теории, давайте познакомимся!
Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?
Практические проекты – это то, как вы обостряете вашу пилу в кодировке!
Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?
Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.
Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.
Присоединяйтесь к свободному вебинару сейчас!
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.