일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Snort Rule
- Cosmos
- TDD
- 프로그래머스
- docker
- 스노트 룰
- 리눅스
- OSI7계층
- 컨테이너
- 데이터베이스
- 라우터
- Router
- database
- Python
- Routing
- 라우팅
- coding test
- 코딩 테스트
- Linux
- snort
- db
- MySQL
- osi7layer
- Container
- 도커
- programmers
- 코딩테스트
- 트레바리
- 스노트
- 라우팅프로토콜
- Today
- Total
Simple is IT, 누구나 보고 누구나 깨닫는 IT
Python Deep copy, Shallow copy! 본문
파이썬에서 주어진 문제를 풀던 중 이런 이슈가 발생했어요!
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
저와 같은 문제를 겪는 분이 많을거라 예상되어 글로 남기네요! 감사합니다.