2016-02-16 1 views
1

У меня есть matrix = [[1,2,3],[4,5,6],[7,8,9]] и matrix2=matrix. Теперь я хочу удалить первую строку из матрицы2, т. Е. matrix2.remove(matrix[0]).Удалить строку из матрицы в python

Но я получаю эту

>>> matrix2.remove(matrix2[0]) 
>>> matrix2 
    [[4, 5, 6], [7, 8, 9]] 
>>> matrix 
    [[4, 5, 6], [7, 8, 9]] 

Первый ряд matrix также удаляется. Может кто-нибудь объяснить это? И как удалить первую строку из matrix2 без изменения matrix

+0

вам нужно сделать глубокую копию вашей матрицы ... возможно дубликат http://stackoverflow.com/questions/6431973/how-to-copy-data-from-a-numpy-array- к-другому –

+0

Nope @JulienSpronck. Мой вопрос: «Что здесь происходит !!» Я удаляю строку матрицы2, почему строка из матрицы также удаляется !? – Kavan

+0

проверьте этот другой вопрос, а также ... http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-deepcopy-and-normal-assignm –

ответ

3

Try:

>>> matrix = [[1,2,3],[4,5,6],[7,8,9]] 
>>> 
>>> # make matrix2 a (shallow) copy of matrix 
>>> matrix2 = matrix[:] 
>>> matrix2.remove(matrix[0]) 
>>> print(matrix2) 
[[4, 5, 6], [7, 8, 9]] 

Хм ... почему? Потому что заявление matrix2 = matrix не «копирует» значение ... это просто означает, что имя matrix2 указывает на то же самое значение, что и имя matrix.

Чтобы создать (неглубокую) копию списка, мы можем просто нарезать его как matrix2 = matrix[:]. Это создает имяmatrix2, что указывает на новый список, содержащий все значения имениmatrix

+0

Работало. Но в чем проблема выше !? – Kavan

2

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

from copy import deepcopy 

matrix = [[1,2,3],[4,5,6],[7,8,9]] 
matrix2 = deepcopy(matrix) 

matrix2.remove(matrix2[0]) 

matrix 
[Out]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
matrix2 
[Out]: [[4, 5, 6], [7, 8, 9]] 
+0

Спасибо! @ meltdown90 – Kavan

2

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

from copy import * 

matrix = [[1,2,3],[4,5,6],[7,8,9]] 
matrix1 = copy(matrix)  
matrix1.remove(matrix1[0]) 

matrix 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
matrix1 
[[4, 5, 6], [7, 8, 9]] 
Смежные вопросы