일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준 12015
- 백준 2606
- 미로탐색
- 증가하는 부분수열 2
- 타겟 넘버
- 가장 긴 증가하는 부분수열
- 파이썬
- 12865
- python
- 평범한 배낭
- list
- 알고리즘
- 2606
- 백준 9252
- BOJ 2606
- 8-queen
- 데카르트 곱
- 9663
- 백준 1535
- 대소비교
- 소수찾기
- dfs
- BFS
- LCS2
- 프로그래머스
- boj 11053
- 냅색
- 백준_2178
- 백준
- 리스트
- Today
- Total
Devlog_by_0giru
리스트와 메모리 공간 본문
파이썬에서 리스트를 사용할 때에는 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)를 반드시 고려하여 사용하여야 한다.
먼저 파이썬 얕은 복사의 대표적인 예를 보자.
temp = list()
temp.append(1)
temp.append(2)
temp.append(3)
temp_anther = temp
print(id(temp))
print(id(temp_anther))
이 코드의 실행 결과는 아래와 같다.
1859362000832
1859362000832
대입연산자 = 를 이용해 리스트를 복사하면, 복사 된 리스트는 피 복사된 리스트와 같은 메모리 공간을 공유하게 된다.
따라서 temp 리스트의 데이터를 수정하게 되면 temp_another 리스트의 데이터도 동일하게 수정된다.
temp = list()
temp.append(1)
temp.append(2)
temp.append(3)
temp_anther = temp
# temp 리스트의 0번 인덱스 데이터를 삭제함
del temp[0]
print(temp)
print(temp_anther)
[2, 3]
[2, 3]
리스트를 사용할 땐 데이터를 리스트에 추가해주는 append() 메소드를 정말 자주 이용하게 되는데, 알고리즘 문제를 풀다보니 동일한 문제를 겪게 되었다.
다음 코드를 보자.
temp = list()
temp_list = list()
temp.append(1)
temp.append(2)
temp.append(3)
temp_list.append(temp)
temp.clear()
temp.append(4)
temp.append(5)
temp.append(6)
temp_list.append(temp)
print(temp_list)
위 코드를 실행하면 어떤 결과가 출력될까?
나는 당연히 [[1, 2, 4], [4, 5, 6]]이 출력될 줄 알았으나 결과는 아래와 같았다.
[[4, 5, 6], [4, 5, 6]]
temp_list 리스트에 append()를 이용해 추가해준 리스트는 둘다 temp 리스트였기 때문에 같은 메모리 공간을 공유하고, 따라서 이전에 들어간 리스트가 동일한 영향을 받았다.
이 문제는 .copy() 메소드를 통해 해결할 수 있었다.
temp = list()
temp_list = list()
temp.append(1)
temp.append(2)
temp.append(3)
temp_list.append(temp)
temp1 = temp.copy()
temp1.clear()
temp1.append(4)
temp1.append(5)
temp1.append(6)
temp_list.append(temp1)
print(temp_list)
[[1, 2, 3], [4, 5, 6]]
.copy를 통해 새로운 메모리 공간을 사용하는 리스트를 만들어 주면 된다.
* 위 예시로 든 코드는... 굳이 copy를 사용할 필요 없이 단순히 새로운 리스트를 만들어 append 해주면 되는 솔직히 별 의미가 없어진 코드이다... 그런데 copy를 예로 든 이유는 알고리즘 문제를 풀 때 이전에 있던 데이터의 극히 일부만 수정해 새로 append 해주었기 때문이다 ㅠㅠ
여튼, 하나의 리스트를 통해 데이터를 퍼나를 수 없다는 것을 알게 되었다.
'[파이썬]' 카테고리의 다른 글
무한대를 값는 변수 만들기 (0) | 2021.02.15 |
---|---|
파이썬 리스트의 비어있음을 확인하는 방법 (0) | 2021.02.15 |
파이썬 리스트 내에서 자료 스왑하기 (0) | 2021.02.08 |