티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

How do I clone a list so that it doesn't change unexpectedly after assignment?

리스트 생성 후 예기치 않게 변경되지 않도록 리스트 복사본 만들기

 문제 내용 

While using new_list = my_list, any modifications to new_list changes my_list every time. Why is this, and how can I clone or copy the list to prevent it?

new_list = my_list를 사용하는 동안 new_list를 수정하면 my_list가 매번 변경됩니다. 이유는 무엇이며 리스트를 복제하거나 복사하여 이를 방지하려면 어떻게 해야 합니까?

 

 

 

 높은 점수를 받은 Solution 

new_list = my_list doesn't actually create a second list. The assignment just copies the reference to the list, not the actual list, so both new_list and my_list refer to the same list after the assignment.

new_list = my_list는 실제로 두 번째 리스트를 만들지 않습니다. 할당은 실제 리스트가 아닌 리스트의 참조만 복사하므로 new_list와 my_list 모두 할당 후 동일한 리스트를 참조합니다.

 

To actually copy the list, you have several options:

실제로 리스트를 복사하려면 다음과 같은 몇 가지 옵션이 있다:

 

  • You can use the builtin list.copy() method (available since Python 3.3):
  • new_list = old_list.copy()
  • You can slice it:Alex Martelli's opinion (at least back in 2007) about this is, that it is a weird syntax and it does not make sense to use it ever. ;) (In his opinion, the next one is more readable).
  • new_list = old_list[:]
  • You can use the built in list() constructor:
  • new_list = list(old_list)
  • You can use generic copy.copy():This is a little slower than list() because it has to find out the datatype of old_list first.
  • import copy new_list = copy.copy(old_list)
  • If you need to copy the elements of the list as well, use generic copy.deepcopy():Obviously the slowest and most memory-needing method, but sometimes unavoidable. This operates recursively; it will handle any number of levels of nested lists (or other containers).
  • import copy new_list = copy.deepcopy(old_list)

 

Example:

예:
import copy

class Foo(object):
    def __init__(self, val):
         self.val = val

    def __repr__(self):
        return f'Foo({self.val!r})'

foo = Foo(1)

a = ['foo', foo]
b = a.copy()
c = a[:]
d = list(a)
e = copy.copy(a)
f = copy.deepcopy(a)

# edit orignal list and instance 
a.append('baz')
foo.val = 5

print(f'original: {a}\nlist.copy(): {b}\nslice: {c}\nlist(): {d}\ncopy: {e}\ndeepcopy: {f}')

 

Result:

결과:
original: ['foo', Foo(5), 'baz']
list.copy(): ['foo', Foo(5)]
slice: ['foo', Foo(5)]
list(): ['foo', Foo(5)]
copy: ['foo', Foo(5)]
deepcopy: ['foo', Foo(1)]

 

 

 가장 최근 달린 Solution 

Remember that in Python when you do:

Python에서 다음을 수행할 때 기억하십시오.
    list1 = ['apples','bananas','pineapples']
    list2 = list1

 

List2 isn't storing the actual list, but a reference to list1. So when you do anything to list1, list2 changes as well. use the copy module (not default, download on pip) to make an original copy of the list(copy.copy() for simple lists, copy.deepcopy() for nested ones). This makes a copy that doesn't change with the first list.

List2는 실제 목록을 저장하는 것이 아니라 list1에 대한 참조입니다. 따라서 list1, list2도 변경됩니다. 복사 모듈(기본값이 아닌 pip에서 다운로드)을 사용하여 목록의 원본 복사본(단순 목록의 경우 copy.copy(), 중첩 목록의 경우 copy.deepcopy()를 만듭니다. 이렇게 하면 첫 번째 목록과 변경되지 않는 복사본이 만들어집니다.

 

 

 

출처 : https://stackoverflow.com/questions/2612802/how-do-i-clone-a-list-so-that-it-doesnt-change-unexpectedly-after-assignment

반응형
댓글
공지사항
최근에 올라온 글