Проблема с зависимостью списков (python)

1

Я уверен, что на этот вопрос ответили тысячи раз, но английский не мой родной язык, и я действительно плохо разбираюсь, поэтому прошу прощения. Я пытаюсь изучить python, написав базу данных для своей работы, поэтому я встретил эту проблему. Упрощенный мир кода:

    x=[[0,0],[0,0]]
    y=x[0:]
    y[0][0]="1"
    print x

и выход:

    [['1', 0], [0, 0]]

Я понимаю, что здесь отсутствует что-то фундаментальное, но почему "х" было изменено вместе с "у"?. Все ответы будут высоко оценены.

Теги:
list

2 ответа

3
Лучший ответ

Использование x[0:] не создает "глубокую копию"; он по существу копирует ссылки на внутренние массивы или "мелкую копию", так что установка y[0] или y[1] не изменит x, но установка внутренних элементов массива будет.

  • 0
    Кстати, у модуля copy есть метод deepcopy который может быть тем, что нужно OP. (Также x[0:] может быть сокращено до x[:] )
  • 0
    Спасибо, ребята, проблема решена
2
y=x[0:] 

Это копирует список x, но поскольку элементы x являются массивами, они будут скопированы как ссылки. Вам нужно скопировать каждый элемент x. Например:

y = [val[:] for val in x]

Тогда изменение y не повлияет на x.

Редактировать:

Другой вариант, который работает для более широкого deepcopy случаев, подобен тому, как это было предложено deepcopy. Так:

from copy import deepcopy

y = deepcopy(x)

Это будет работать для вложенных списков и неистребимых элементов.

  • 0
    deepcopy лучше, потому что это не удастся, если некоторые элементы не будут подписаны, и если массив состоит из более чем двух уровней.
  • 0
    Я согласен, что глубокая копия лучше, но я думаю, что этот ответ мог бы лучше объяснить, почему его подход не сработал. Отредактировал мой ответ с этим тоже.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню