2011-08-17 3 views
1

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

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

и выход:

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

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

ответ

3

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

+0

FYI, модуль 'copy' имеет метод' 'deepcopy' '(http://docs.python.org/library/copy.html#copy.deepcopy), который может понадобиться OP. (Также 'x [0:]' может быть сокращено до 'x [:]') –

+0

Спасибо, ребята, проблема решена. – HamsteR

2
y=x[0:] 

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

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

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

Edit:

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

from copy import deepcopy 

y = deepcopy(x) 

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

+0

'deepcopy' лучше, потому что это не удастся, если некоторые элементы не будут зашифровываться, и если массив состоит из более двух уровней. –

+0

Я согласен, что deepcopy лучше, но я думаю, что этот ответ может быть лучше объяснить, почему его подход не сработал. Отредактировал свой ответ тоже. – Bogdan

+0

Спасибо. Интересно, почему целые числа, строки и другие типы работают не так. – HamsteR

Смежные вопросы