Arhlit - информационные технологии

Не удается сделать копии списка Python для работы

У меня проблема, когда я пытаюсь работать со списком и его копией. Я знаю, что есть определенные способы скопировать список в Python, и думаю, что следую им. Вот моя проблема.

a = []
for i in range(10):
    a.append([0]*10)

b = a[:]

for j in a:
    j[0] = 1

print a
print b

Создаю пустой список. Затем я добавляю 10 подсписок нулей ([0,0,0,0,0 ....]). Затем я копирую список и, наконец, перебираю первый. Но когда я их распечатываю, оба списка изменились.

02.06.2014

Ответы:


1

Вы создали только неглубокую копию. Это создает новый список со ссылками на содержащиеся значения. Списки, содержащиеся в a, по-прежнему используются совместно списками a и b.

Вы можете добавить уровень копирования:

b = [elem[:] for elem in a]

Это создает новый объект списка, содержащий мелкие копии вложенных списков из a. Поскольку сами вложенные списки содержат только неизменяемые объекты (целые числа), этого здесь достаточно.

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

02.06.2014

2

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

b = copy.deepcopy(a)
02.06.2014

3

Другой способ создания полной копии - использовать функцию copy.deepcopy модуля copy: doc

02.06.2014

4

3 варианта:

b = list(list(item) for item in a)

  • Понимание списка

b = [item[:] for item in a]

import copy b = copy.deepcopy(a)

02.06.2014
  • b = [item for item in a], похоже, не работает, тогда как b = [item [:] для item in a] - как предлагается в ответе ниже - работает (с python 2.7) 02.06.2014
  • ах, извините, да, действительно должен прочитать вопрос правильно, нужно скопировать списки внутри списков, а не просто скопировать список, обновленный 02.06.2014
  • Новые материалы

    12 сайтов с искусственным интеллектом, которые поразят вас
    Приготовьтесь поразить воображение Сегодня существует несколько веб-сайтов, использующих искусственный интеллект (ИИ). От индивидуальных рекомендаций по новостям до более умных поисковых..

    Скрытый технический долг в системах машинного обучения [NeurIPS 2015]
    Что такое технический долг? Технический долг — это метафора, введенная Уордом Каннингемом в 1992 году, чтобы объяснить долгосрочные затраты, связанные с быстрым продвижением в разработке..

    Алгоритм быстрой сортировки в Python
    Всем привет, добро пожаловать на programminginpython.com . Здесь я покажу вам, как реализовать алгоритм быстрой сортировки в Python. В предыдущих статьях я рассмотрел Сортировку вставкой ,..

    Как использовать манипулирование объектами в JavaScript
    Объекты являются важным строительным блоком JavaScript. Они позволяют группировать свойства и методы вместе. Объект представляет собой набор свойств. Свойства идентифицируются с..

    Разработка игр с помощью Godot Engine: мощный инструмент с открытым исходным кодом
    Разработка игр — творческий и сложный процесс, требующий множества навыков и инструментов. Одним из наиболее важных инструментов является игровой движок, который представляет собой программную..

    От XML к аннотациям: переход к современной конфигурации Spring
    Введение Фреймворк Spring претерпел значительную эволюцию с момента своего создания. Одним из заметных изменений стал переход от конфигураций на основе XML к конфигурациям, управляемым..

    Я люблю Руби!
    Я люблю Руби! Мне это нравится по той же причине, по которой мне нравится программировать на Python. Он настолько интуитивно понятен, а встроенные методы упрощают решение проблем. Если вы..