Simple is IT, 누구나 보고 누구나 깨닫는 IT

Python Deep copy, Shallow copy! 본문

Simple is IT/Programming

Python Deep copy, Shallow copy!

currenjin 2020. 7. 3. 23:35

파이썬에서 주어진 문제를 풀던 중 이런 이슈가 발생했어요!

 

Question)

다음을 만족하는 함수, solution을 완성해주세요.

  • solution 함수는 이차원 리스트, mylist를 인자로 받습니다

  • solution 함수는 mylist 원소의 행과 열을 뒤집은 한 값을 리턴해야합니다.

예를 들어 mylist [[1,2,3], [4,5,6], [7,8,9]]가 주어진 경우, solution 함수는 [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 을 리턴하면 됩니다.

 

제한 조건

  • mylist의 원소의 길이는 모두 같습니다.

  • mylist의 길이는 mylist[0]의 길이와 같습니다.

  • 각 리스트의 길이는 100 이하인 자연수입니다.

 

위 문제는 아주 간단한 코드로 작성이 가능해요!

def solution(mylist):
    answer = list(map(list, zip(*mylist)))
    return answer

 

 

하지만 그때는 zip 함수를 제대로 알지 못 했었어요. 그래서 아래와 같은 코드를 작성했었죠.

def solution(mylist):
    answer = mylist
    for i in range(len(mylist)):
        for j in range(len(mylist)):
            answer[i][j] = mylist[j][i]
    return answer

 

이렇게 작성을 하고.. 실행을 해보니까 어라?

input:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

output:
[[1, 4, 7], [4, 5, 8], [7, 8, 9]]

answer의 값을 변경시켜주는데 mylist의 값도 그대로 바뀌더군요!

 

answer = mylist

이 코드가 문제의 원인이었습니다.

 

 

본론

저로써는 생각지도 못 한 기능이었어요.

파이썬에서는 리스트 또는 딕셔너리 등의 오브젝트를 다른 변수에 대입하여 사용할 경우

a = b

이렇게 사용하지요.

 

이런 방식에서는 a가 b의 포인터를 가지고 있으며 a의 값이 변경될 경우 b의 값도 고스란히 변경되는 구조였습니다.

리눅스로 따지면 심볼릭과 같은 느낌이죠..

 

 

이 때 사용하는 함수가 shallow copy, deep copy !!

 

shallow copy는 위 처럼 주소 값을 그대로 복사해 가는 것이고

deep copy는 새로운 변수를 만들어 새 주소에 변수 값을 넣어주기 떄문에 서로 엮일 일이 없어요.

 

 

shallow copy example:

import copy

a = [1,2,3,4]
b = copy.copy(a)

b.append(5)

print b
[1,2,3,4,5]

print a
[1,2,3,4,5]

 

 

deep copy example:

import copy

a = [1,2,3,4]
b = copy.deepcopy(a)

b.append(5)

print b
[1,2,3,4,5]

print a
[1,2,3,4]

 

 

알게된 사실을 적용하니 이런 코드가 나오더군요 ㅎㅎ

import copy

def solution(mylist):
    answer = copy.deepcopy(mylist)
    for i in range(len(mylist)):
        for j in range(len(mylist)):
            answer[i][j] = mylist[j][i]
    return answer

 

저와 같은 문제를 겪는 분이 많을거라 예상되어 글로 남기네요! 감사합니다.

Comments