2016-03-26 2 views
0

Однако, когда я меняю новое, он также меняет self._marker. Я хочу иметь возможность менять новое, не меняя self._marker. Я тоже не могу использовать функцию deepcopy, так как я делаю эту операцию несколько тысяч раз и не могу получить огромную производительность за использование deepcopy.Как создать копию списка без изменения его содержимого?

Что мне делать?

+8

Если вы хотите получить глубокую копию, вам нужно сделать глубокую копию. И да, глубокие копии могут быть дорогими. Что вы на самом деле пытаетесь сделать? (т. е. я думаю, что это проблема XY) – Claudiu

+0

Примечание: чтобы сделать копию на два уровня, вы могли бы сделать 'new = [l [:] для l в self._marker]' – Claudiu

+0

@Claudiu Im пытаюсь сделать копию моего атрибута _marker, поэтому я могу использовать копию и мутировать ее, но в следующий раз, когда я это сделаю, я хочу, чтобы self._marker остался прежним и не менял – Randomuser123

ответ

0

Вы на правильном пути, но предлагаемое решение не работает, потому что вы не делаете копию внутренних списков. Они остаются прежними.

Вы можете сделать это:

new_list = [e[:] for e in self._marker] 

Это Performa DeepCopy который является то, что вам нужно в этом случае.

Это отвечает на вопрос, который вы задали. Если у вас есть другие требования, вам нужно сделать их явным в своем вопросе.

+0

OP уже отклонил этот ответ в комментарии к (теперь удаленному) ответу – Claudiu

+0

Это отвечает на вопрос, хотя. – DevShark

+0

Несомненно, но это делает то же самое, что и глубокая копия, и поэтому страдает от той же проблемы. Также это уже [в комментариях] (http://stackoverflow.com/questions/36237712/how-do-i-make-a-copy-of-a-list-without-changing-its-contents/36238470?noredirect = 1 # comment60105870_36237712). – Claudiu

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