Python - назначение и изменение списка из словаря

Я заметил что-то странное, помогая коллегу с его сценарием Python 2.7. У него есть словарь со списками в качестве значений словаря. Он присваивал значения словаря новой переменной и затем выполнял некоторые изменения в списке. Нечетная часть, которая меня достала, это изменения списка в новой переменной, которые также отражаются в словаре. Я повторил простой пример в оболочке, и я разместил его ниже. Я также пробовал то же самое, но со строкой в ​​качестве значения словаря, но без эффекта. Есть ли что-то, чего я здесь не вижу, или это какая-то ошибка? Благодарю.

>>> dict1 = {}
>>> dict1['foo'] = [1,2,3]
>>> print dict1     
 {'foo': [1, 2, 3]}    
>>> bar = dict1['foo']
>>> bar.append(4)
>>> print dict1    
 {'foo': [1, 2, 3, 4]}

В приведенном выше примере я ожидал, что 4 будет добавлен в bar , а значение «foo» останется [1,2,3].

0
nl ja de

1 ответы

Вы не получаете копию списка, вы получаете ссылку на список. Поскольку списки изменяемы, поведение полностью ожидается.

Сравните это с использованием второй переменной, указывающей на список:

>>> a = [1, 2, 3]
>>> b = a
>>> b.append(4)
>>> a
[1, 2, 3, 4]

Если вы хотите иметь независимый список, сделайте копию:

>>> c = list(a)
>>> c.append(5)
>>> c
[1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4]

Другой способ сделать копию - использовать фрагмент полного списка:

>>> c = a[:]
3
добавлено
Благодаря! Я только что нашел googled страницу, объясняющую, как это работает «под капотом», теперь у меня есть хорошие ключевые слова для работы. Я предполагаю, что это была просто тонкость, которую я никогда не встречал раньше.
добавлено автор feik, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

CSS — русскоговорящее сообщество
CSS — русскоговорящее сообщество
1 502 участник(ов)

Сообщество любителей CSS Возникли проблемы с CSS? – пиши сюда, обсудим и предложим самое лучшее решение Работа: @css_ru_jobs Правила: https://teletype.in/@css_ru/r1EWtQ2w7 Приходите в наши чаты @javascript_ru и @frontend_ru Флуд: @css_flood

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Чат — Типичный Верстальщик
Чат — Типичный Верстальщик
1 080 участник(ов)

Основной канал: @tpverstak Обратная связь: @annblok Все ссылки на соц.сети проекта: http://taplink.cc/tpverstak ПРАВИЛА ЧАТА — https://teletype.in/@annblok/BygPgC3E7

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

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

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community

Веб-Технологи: UI/UX, Вёрстка, Фронтенд
Веб-Технологи: UI/UX, Вёрстка, Фронтенд
167 участник(ов)

Всё про веб-дизайн и вёрстку. А также: HTML, CSS, флекс и бутстрапы, шаблонизаторы, препроцессоры, методологии, аглифаеры, улучшаторы и обфускаторы. Обсуждаем темы юзабилити, устраиваем А/В тесты лендингов, и проводим аудит.

DTP :: @DTPublish
DTP :: @DTPublish
147 участник(ов)

Обсуждаемые темы: полиграфия, препресс, верстка, дизайн, иллюстрации, скрипты, плагины. Канал - @DTPublishing

css_jobs
css_jobs
26 участник(ов)

Чат для вопросов по css и html: @css_ru Флуд: @css_flood Канал с вакансиями и резюме: @css_jobs_feed

css_флуд
css_флуд
10 участник(ов)