Devlog_by_0giru

리스트와 메모리 공간 본문

[파이썬]

리스트와 메모리 공간

0giru_kim 2021. 2. 22. 13:41

파이썬에서 리스트를 사용할 때에는 얕은 복사(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 해주었기 때문이다 ㅠㅠ

 

여튼, 하나의 리스트를 통해 데이터를 퍼나를 수 없다는 것을 알게 되었다.