Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 6

Как сделать копию списка с вложенными списками?

24.11.2013, 13:11. Показов 5661. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Столкнулся с необъяснимым результатом при клонировании листа. В этой книжке (http://openbookproject.net/thi... ning-lists) сказано, что самый простой способ сделать копию листа (чтобы ее можно было впоследствии менять без автоматических изменений в изначальном листе) - это слайсинг.

Применил - и столкнулся с непонятным для меня результатом. Вот код:

Python
1
2
3
4
5
6
7
m1 = [[1, 2], [3, 4]]
m2 = [[2, 2], [2, 2]]
c = m1[:]
print c is m1
c[0][0] = 1
print c == m1
print c is m1
здесь c - клон листа m1, выполненный с помощью слайсинга. Строка №4 выдает значение True, это значит (как я понял) что c и m1 - разные листы. Но как только я меняю первое значение в листе с, меняется и значение в листе m1 (значение True, которое показывает строка №6).

Что я делаю не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2013, 13:11
Ответы с готовыми решениями:

Сортировка списка с вложенными списками
Здравствуйте, получаю список с списками такого формата: , , , , , ] Мне нужно отсортировать списки внутри по второму элементу...

Вычисление суммы списка с вложенными списками посредством рекурсии
Добрый вечер. Занимаюсь самоизучением Python и столкнулся с рекурсивными функциями. Пример был такой def list_sum(list1): if...

Как создать структуру разных типов с вложенными списками?
class a { class b { List<T> list=new List<T>; } class c { List<T> list=new...

8
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
24.11.2013, 13:38
is - проверяет соответствие объекту, то есть является один объект ссылкой на другой.
Python
1
2
3
4
5
6
7
8
>>> a = [1, 2, 3]
>>> b = [3, 5, 6]
>>> a is b
False
>>> c = a[:]
>>> c is a
False
>>>
Как видишь после копирования списка с помощью получения среза создаётся копия списка, которая не ссылается на старый список. Это видно из того, что оператор is возвращает False.
0
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 6
24.11.2013, 14:08  [ТС]
Так, у меня есть огрехи в коде, которые не позволяют увидеть, в чем вопрос. Вот измененный код:

Python
1
2
3
4
m1 = [[1, 2], [3, 4]]
c = m1[:]
c[0][0] = 50
print m1
Здесь я ожидаю увидеть:
Python
1
[[1, 2], [3, 4]]
А получается:
Python
1
[[50, 2], [3, 4]]
Почему так происходит - непонятно. Есть соображение, что это как-то связано с тем, что M1 и C содержат вложенные листы.

К примеру вот такой код:

Python
1
2
3
4
5
m1 = [[1, 2], [3, 4]]
c = m1[:]
c[0] = 50
print m1
print c
Выдает ожидаемый результат (с изменился, m1 остался неизменным).
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
24.11.2013, 14:43
А ну да, все правильно, список m1 ты полностью копируешь, а вложенные списки у тебя не копируются по этому так происходит.

Добавлено через 4 минуты
Тебе нужно использовать функцию глубокого копирования deepcopy() из модуля copy.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> a = [[1,2,3],[1,2,3]]
>>> b = a[:]
>>> b
[[1, 2, 3], [1, 2, 3]]
>>> a[0][1] = 33
>>> b
[[1, 33, 3], [1, 2, 3]]
>>> import copy
>>> x = [[1,2,3],[1,2,3]]
>>> z = copy.deepcopy(x)
>>> z
[[1, 2, 3], [1, 2, 3]]
>>> x[0][0] = 33
>>> z
[[1, 2, 3], [1, 2, 3]]
>>>
2
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 6
24.11.2013, 15:16  [ТС]
Спасибо!

Подумал, что раз уж осваиваю питон по книжке, значит задачу можно решить с применением материала, изложенного ранее, до этой задачи. Поэтому из спортивного интереса боднул вопрос еще раз, получилось следующее:
Python
1
2
3
4
5
6
7
m1 = [[1, 2], [3, 4]]
c = []
for index, value in enumerate(m1):
    c = c +[list(m1[index])]
c[0][0] = 32464326
print c
print m1
Так тоже работает.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
24.11.2013, 15:24
Ну да, но это более длинный способ, менее очевидный и скорее всего он расходует больше памяти. По этому рекомендую использовать встроенную функцию.

Добавлено через 4 минуты
odinsapog, кстати по поводу изучения языка. Рекомендую изучать по книге Марк Лутц - Изучаем Python (3 издание, 2009 год). Там рассмотрены все основы языка и трудности которые могут возникать при изучении.
1
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 6
26.11.2013, 07:18  [ТС]
Спасибо.
0
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 6
12.03.2014, 09:39  [ТС]
Книгу прочитал, действительно стоящая вещь. Спасибо за совет!
0
1 / 1 / 1
Регистрация: 06.06.2015
Сообщений: 8
13.11.2016, 22:40
Нужно создать полную копию списка:

Python
1
2
3
4
5
6
7
import copy
 
m1 = [[1,2],[3,4]]
c = copy.deepcopy(m1)
c[0][0] = 500
 
print(m1); print(c)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2016, 22:40
Помогаю со студенческими работами здесь

сделать копию списка
uses crt; type List = ^Tlist; Tlist = record fam: string; name: string; otchestvo: string; marka:...

Сделать копию односвязного списка и отсортировать
Помогите, пожалуйста, решить задачу. Есть список, нужно сделать его копию и отсортировать. Исходный список получился. Как дальше поступить?...

Работа с вложенными списками
Подскажите пожалуйста: есть список ], ], , ], , ], , ]] как добиться вида: , , , , , , ] ?

Работа с вложенными списками
Есть 2 класса, первый Job хранит в себе список второго JobTitle Задача в том чтобы при нажатии на елемент списка Job в втором списке...

Проблемы с вложенными списками (2д массив)
Очень странное поведение при попытке вставки в матрицу новую "колонку": >>> g = *3]*4 >>> g , , , ] >>> for n...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru