(오류 수정 환영합니다!)
1. C언어가 변수를 다루는 방식
일반적으로 c언어는 다음과 같은 방식으로 변수를 다룬다.
•
<값 참조(call by value)>
•
<주소 참조(call by reference)>
위 방식들은 알고 있다는 전제로 이야기를 이어나가겠다. (시간나면 정리해보겠습니다!)
2. 파이썬이 변수를 다루는 방식
•
call by Assignment(=call by object reference)
파이썬은 c언어와 다른 방식으로 변수를 다룬다.
c언어에서는 1이라는 값을 세 변수에 할당해주면 각각의 공간에 각각 1을 저장한다.
하지만 파이썬은 1이라는 객체를 생성하고 각 변수들은 1이라는 객체를 가리킨다.
a = b = c = 1
print('a = ', id(a),'b = ', id(b),'c = ', id(c)) #id() 는 주소값을 알려줌
a += 1
print('a = ', id(a))
a -= 1
print('a = ', id(a))
lst = [1, 2, 3]
print('lst = ', id(lst),'lst[0] = ', id(lst[0]),'lst[0]+1 = ', id(lst[0]+1))
Python
복사
다음은 실제 출력 내용이다.
a, b, c의 주소가 모두 같다.
모두 '1'이라는 객체를 가리키고 있다.
a에 +1을 하면(=2) 주소가 변경된다.
a는 '2'라는 객체를 가리킨다.
a에 -1을 하면(=1) 다시 b, c와 같은 주소를 가진다.
a는 다시 '1'이라는 객체를 가리킨다.
lst[0] 과 lst[0]+1의 주소가 다르고 lst[0] +1 의 주소는 두번째 줄 a의 주소와 같다.
'2'라는 객체는 여전히 살아있었다.
3. 한 발 더 나아가기
•
call by assignment 에 대해 검색해보면 알겠지만 immutable 객체와 mutable 객체일 때 다르게 동작한다. immutable 과 mutable을 모르겠다면 다음 페이지로! Mutable / Immutable
•
그럼 파이썬은 메모리 관리를 어떻게 할까? 내장된 가비지 콜렉터(Garbage Collector)를 이용한다. 즉! 파이썬이 알아서 메모리를 관리한다.
엥? 어떻게 스스로 하냐고? 파이썬은 객체를 생성하면서 그 객체를 변수들이 얼마나 참조하는지 세아린다. 만약 변수들이 더이상 객체를 참조하지 않는다면(카운팅이 0이 되면) 그때 가비지 콜렉터가 이를 수집하고 할당 해제한다. (추가할게용^^)