Я уверен, что на этот вопрос ответили тысячи раз, но английский не мой родной язык, и я действительно плохо разбираюсь, поэтому прошу прощения. Я пытаюсь изучить python, написав базу данных для своей работы, поэтому я встретил эту проблему. Упрощенный мир кода:
x=[[0,0],[0,0]]
y=x[0:]
y[0][0]="1"
print x
и выход:
[['1', 0], [0, 0]]
Я понимаю, что здесь отсутствует что-то фундаментальное, но почему "х" было изменено вместе с "у"?. Все ответы будут высоко оценены.
Использование x[0:]
не создает "глубокую копию"; он по существу копирует ссылки на внутренние массивы или "мелкую копию", так что установка y[0]
или y[1]
не изменит x
, но установка внутренних элементов массива будет.
y=x[0:]
Это копирует список x, но поскольку элементы x являются массивами, они будут скопированы как ссылки. Вам нужно скопировать каждый элемент x. Например:
y = [val[:] for val in x]
Тогда изменение y не повлияет на x.
Редактировать:
Другой вариант, который работает для более широкого deepcopy
случаев, подобен тому, как это было предложено deepcopy
. Так:
from copy import deepcopy
y = deepcopy(x)
Это будет работать для вложенных списков и неистребимых элементов.
deepcopy
лучше, потому что это не удастся, если некоторые элементы не будут подписаны, и если массив состоит из более чем двух уровней.
copy
есть методdeepcopy
который может быть тем, что нужно OP. (Такжеx[0:]
может быть сокращено доx[:]
)