파이썬 리스트의 메모리 저장

bearwoong

·

2020. 4. 27. 07:15

728x90

파이썬 리스트의 메모리 저장

파이썬 리스트의 메모리 저장

파이썬에서 리스트를 저장 할 때 리스트에 들어가는 값을 저장하는 것이 아니라 값이 있는 메모리의 주소를 저장한다. 예를들어 numbers = [ 564, 846, 874, 325] 라는 리스트가 있다고 가정해보자. 여기서 numbers 리스트는 564, 846, 874, 325와 같은 값을 저장하는 것이 아닌, 각각의 값들이 할당된 주소를 저장한다. 아래의 그림을 보면 조금이나마 이해가 쉬울 수 있다.

파이썬 리스트의 메모리 저장

numbers1 = [564, 846, 874, 325]
numbers2 = [456, 587, 698, 774]
total_numbers = [numbers1, numbers2]
print (f'첫 번째 total_numbers는 {total_numbers}')

numbers2[0] = 10000
print (f'두 번째 total_numbers는 {total_numbers}')

6번 째 라인에서 numbers2 리스트의 456을 10000으로 바꾸고 total_numbers 리스트는 건드리지 않았다.
그럼에도 불구하고 이 코드를 실행시켜보면 두 번째 total_numbers에서 456이 10000으로 바뀌는 것을 확인할 수 있다. 처음에 확인한 것 처럼 리스트가 값을 저장하는 것이 아니라 주소를 저장하기 때문에 numbers2만 바꾸어줘도 total_numbers에서 바뀌는 것이다.

파이썬 리스트의 메모리 저장 실행결과 1

다음과 같은 예시도 있다. 

numbers1 = [564, 846, 874, 325]
numbers2 = [456, 587, 698, 774]
print ("----------------------------------------")
print (f'numbers1은 {numbers1}')
print (f'numbers2는 {numbers2}')
print ("----------------------------------------")

numbers2 = numbers1
print (f'numbers2 = numbers1 실행 후 numbers2는 {numbers2}')

numbers1.append(9999)
print (f'numbers1.append(9999) 실행 후 numbers2는 {numbers2}')
print ("----------------------------------------")

numbers2 = numbers1 으로 할당하였다.
이 상태로 numbers2를 출력하면 [564, 846, 874, 325] 즉, numbers1과 같이 나온다. numbers2 = numbers1로 할당하는 순간 numbers2에 numbers1의 주소가 들어가기 때문이다. 

값이 아닌 주소가 들어간 것을 확인하기 위해 numbers1.append(9999)를 해서 numbers1 리스트에 9999를 추가해 주고 numbers2를 출력하였다. 결과는 아래와 같이 numbers1에 9999가 더해진 [564, 846, 874, 325, 9999]가 나온다.

파이썬 리스트의 메모리 저장 실행결과 2

파이썬 리스트와 자료형

파이썬 리스트는 값이 아닌 메모리의 주소를 저장하기 때문에 한 리스트 안에 다양한 자료형이 들어갈 수 있다.

list = [1, 5.6, "python", [33, 14]]

이런 식으로 한 리스트 안에 int, float, string, list 가 모두 들어갈 수 있는 것이다. 또한 만들어진 리스트 안에서 자료형을 바꾸어도 문제없이 실행된다.

list = [1, 5.6, "python", [33, 14]]
print (f' 첫 번째 리스트 = {list}')
print ()

list[0] = "tistory"
print (f' list[0] = "tistory"로 바꾼 리스트 = {list}')

정수형이었던 list[0]을 문자열 "tistory" 로 바꾸었을 때 아래와 같이 실행된다.

파이썬 리스트와 자료형 실행결과

반응형