본문 바로가기
programming/Python

파이썬 리스트 복사하기 Python List Copy

by 개코 - 개발과 코딩 2021. 8. 19.

파이썬 리스트 복사를 하면 원본 데이터는 그대로 두고 복사본을 조작하여 값을 출력할 수 있다. 원본 데이터를 보존하는 것은 중요하다. 2차적을 데이터를 가공하거나 새로운 데이터를 만들 경우 원본 리스트의 내용을 복사하여 사용하는 것이 좋다.

파이썬 List 복사
파이썬 List 복사

 

파이썬 리스트 복사
Python List Copy

파이썬에서 리스트를 복사하는 것은 copy() 명령어를 이용한다.

혹은 할당 연산자를 사용하여 복사를 할 수 있다.

하지만, copy() 함수를 사용하는 것과 할당 연산자를 사용하는 것에는 문제가 있을 수 있다.

이것이 까다로운 부분일 수 있다.

복사를 한 것처럼 보이지만 리스트의 메모리주소만 복사되는 경우 복사된 데이터 수정시 원본데이터까지 수정되는 일이 발생할 수 있다.

데이터의 복사는 원본데이터는 그대로 두고 새로운 객체를 만들어야 한다는 것에 주의 하자.

 

리스트 복사 copy()

파이썬 리스트에서 copy() 함수를 사용하면 리스트의 내용을 복사할 수 있다.

사용법은 List.copy() 이다.

코드로 비교를 해 보도록 하자.

위에서 언급했지만 복사를 하면 새로운 객체가 만들어지고 복사 데이터가 수정이 되더라도 원본데이터가 변경되지 말아야 한다.

print('--------------------------------------------------')

vList = ["JYP", "트와이스", "twice", "Nayeon", "JeongYeon", "Momo", "사나", "지효", "미나", "dahyun", "chaeyoung", "tsuyu"]

vCopy = vList.copy()

print("목록 : ", type(vList), len(vList), vList)
print("복사 : ", type(vCopy), len(vCopy), vCopy)

if vList == vCopy:
    print("값이 같다.")
else:
    print("값이 다르다.")

if vList is vCopy:
    print("객체는 같다.")
else:
    print("객체는 다르다.")

vCopy[1] = "twice"

print("목록 : ", type(vList), len(vList), vList)
print("복사 : ", type(vCopy), len(vCopy), vCopy)

print('--------------------------------------------------')

위의 코드를 보면 List.copy() 함수로 리스트 내용을 복사했다.

복사를 한 후에 값이 같은지 비교하고, 객체가 같은지 비교했다.

마지막으로 복사한 데이터의 값을 변경하고, 원본데이터에 영향이 있는지 확인해 보도록 한다.

결과 화면을 보자.

리스트 데이터가 복사되었다.

가시적으로 값은 같다.

파이썬이 인식하는 두 개의 리스트의 값은 같다. vList == vCopy

하지만, 객체는 다르다. vList is vCopy

이 의미는 새로운 객체가 만들어 졌다는 것을 의미한다.

복사본 리스트의 값을 변경했을 경우 원본데이터의 값에는 변화가 없는 것을 알 수 있다.

 

리스트 복사 할당연산자

List.copy() 함수를 사용하여 새로운 객체로 리스트 복사본를 만들 수 있다.

할당연산자인 = 을 이용하여 리스트 복사본을 만들 수 있다.

코드를 보자.

print('--------------------------------------------------')

vList = ["JYP", "트와이스", "twice", "Nayeon", "JeongYeon", "Momo", "사나", "지효", "미나", "dahyun", "chaeyoung", "tsuyu"]

vCopy = vList

print("목록 : ", type(vList), len(vList), vList)
print("복사 : ", type(vCopy), len(vCopy), vCopy)

if vList == vCopy:
    print("값이 같다.")
else:
    print("값이 다르다.")

if vList is vCopy:
    print("객체는 같다.")
else:
    print("객체는 다르다.")

vCopy[1] = "twice"

print("목록 : ", type(vList), len(vList), vList)
print("복사 : ", type(vCopy), len(vCopy), vCopy)

print('--------------------------------------------------')

과정은 같다.

List.copy() 함수 부분을 할당연산자 = 으로 변경해 주었다.

복사본은 원본데이터에 영향이 없는 새로운 객체를 만드는 것이라고 위에서 언급했다.

위의 코드를 실행을 시켜보자.

가시적으로 보이는 값은 같다.

리스트의 원본과 복사본의 값도 같고, 객체도 같다.

이 말은 리스트의 내용이 아닌 리스트가 존재하는 메모리주소가 복사되었을 수가 있다는 것이다.

이 경우 복사본의 값을 변경할 경우 원본 데이터에도 영향이 갈 수 있다.

결과 화면을 다시 보도록 하자.

복사본의 데이터를 수정했음에도 원본데이터에 까지 영향이 간 것을 알 수 있다.

 

copy() 함수와 할당연산자 = 차이

리스트 데이터를 복사하는 것은 중요하다.

데이터를 복사하고 작업하는 것은 원본데이터를 보존하는 것에 목적이 있다.

하지만, copy() 함수와 할당연산자 = 을 사용한 것의 차이가 뚜렷하다.

copy() 함수는 새로운 객체를 만들어 복사본 데이터를 수정해도 원본데이터에는 영향이 없지만, 할당연산자 = 을 사용한 경우 복사본데이터를 수정할 경우 원본데이터에도 영향이 간 것을 알 수 있다.

물론, 둘 다 상황에 따라 적당히 사용할 수 있지만, 복사본의 의미를 다시 생각해 보면 이 차이는 중요할 수 있다.

 

가끔 데이터 사고가 일어나는 이유가 이런 사소한 것의 차이에서 발생하기도 한다.

다른 언어들도 마찬가지이다.

이런 개념들은 아마도 C 언어나 C++ 를 한 사람이라면 이해할 것이다.

지금같은 시대에 C나 C++를 굳이 파고들지 않아도 되지만, 알아두면 좋다.

반응형

댓글