본문 바로가기

Python 독학/python 기본

The Basics of Python Chapter03 (05),

23.09.05 

 

리스트의 메모리 관리 방식 

이전 포스트에 이어 이차원 리스트를 다시 살펴봅니다. 이차원 리스트를 사용하면 흥미로운 현상을 볼 수 있는데, 먼저 다음 코드를 확인해 본다. 

kor_score=[49, 79, 20, 100, 80]
math_score=[43,59,85,30,90]
eng_scroe=[49, 79, 48, 60, 100]
midterm_score=[kor_score, math_score, eng_scroe]
print(midterm_score)

math_score[0]=1000
print(midterm_score)

>>>[[49, 79, 20, 100, 80], [43, 59, 85, 30, 90], [49, 79, 48, 60, 100]]
>>>[[49, 79, 20, 100, 80], [1000, 59, 85, 30, 90], [49, 79, 48, 60, 100]]

 

math 값을 변경했는데 midterm두번째 행의 첫번째 값이 변경되었다.

(사실 난 이게 당연하다 생각했는데 그게 아닌게 맞는데 결론은 맞는게 맞음 먼소린지 이해하지 마세요 혼잣말입니ㄷ)

이것은 파이썬 리스트가 값을 저장하는 방식 때문에 발생하는 현상이다. 파이썬은 리스트를 저장할 때 값 자체가 아니라 , 값이 위치한 메모리 주소(reference)를 저장한다. 

 

출처: 데이터과학을 위한 파이썬 프로그래밍

예 죄송합니다 사진을 대충 찍긴했는데 그냥 이해하십쇼 별로 어려운 내용아니니까


  2 메모리 저장 구조로 인한 리스트의 특징

-2.1 하나의 리스트에 다양한 자료형 포함 가능

다양한 자료형이 하나의 리스트에 모두 들어갈 수 있다.

 

a=["color", 1, 0.2]
color=['yellow', 'blue', 'green', 'black', 'purple']
a[0]=color
print(a)

>>>[['yellow', 'blue', 'green', 'black', 'purple'], 1, 0.2]

 

문자형, 정수형, 실수형 모두 들어갔고

리스트도 넣을수있는...이를 흔히 중첩리스트라고 한다네요(근데 이미 앞에서 이차원리스트를 했잖아? 비슷한거 아닌가?)

근데 이게 메모리주소를 저장해 메모리에 새로운 값을 할당하는데 있어 매우 높은 자유도를 보장하므로 가능하다네요 

 

 

 

-2.2 리스트의 저장방식 

 

두번째 특징은 리스트의 메모리 저장 방식이다, 지금은 중요하지 않지만, 차후 함수 등 다양한 파이썬 문법을 이해하는 데 필요한 내용이다. 다음 코드를 살펴보자.

a=[5,4,3,2,1]
b=[1,2,3,4,5]
b=a
print(b)

>>>[5, 4, 3, 2, 1]

a=[5,4,3,2,1]
b=[1,2,3,4,5]
b=a
a.sort()
print(b)

>>>[1, 2, 3, 4, 5]

 

b 와 a 변수를 각각 다른 값으로 선언한 후, b에 a를 할당하였다. 그리고 b를 출력하면 a 변수와 같은 값이 화면에 출력된다.

 

그리고 그 다음 식에서 a를 정렬했는데, b도 정렬되어있다. 이러한 결과가 나오는 이유는, b=a 를 입력하는 순간 b리스트도 a리스트의 메모리 주소와 같이 연결되기 때문이다. 두변수가 같은 메모리 주소와 연결되어 있으므로 하나의 변수값만 바뀌더라도 둘다 영향을 받는 것이다. 

 

마지막으로 b에 새로운 값을 할당하면 어떻게 나오는가?

a=[5,4,3,2,1]
b=[1,2,3,4,5]
b=a
a.sort()
b=[6,7,8,9,10]
print(a, b)

>>>[1, 2, 3, 4, 5] [6, 7, 8, 9, 10]

 

위 코드와 같이 b에 새로운 값을 할당하면 a와 b는 같은 메모리 주소와 연결되지 않게된다. 즉, b는 이제 새로운 메모리 주소에 새로운 값을 할당할 수 있는 것이다. 기억해야할 것은 b=a 코드이다. 어떤 리스트값을 하나의 변수에 할당하는 순간, 두 변수는 같은 메모리 주소에 연결되게 된다.