변수는 값에 대한 이름표

떵떵·2022년 4월 14일
0

출처 - wikidocs 레벨업 파이썬

바인딩

어떤 값이 자주 사용될 때 값을 직업 기억하기보다는 그 값을 참조하는 이름표를 붙여 둘 수 있는데 이를 변수라고 한다.

a = 3

위 코드에서 =는 바인딩을 의미한다. 바인딩이란 변수가 어떤 값을 가리키는 것을 의미하고
=가 있으면 인터프리터는 오른쪽을 먼저 해석한다, 따라서 위 코드가 실행되면 3이라는 정수 타입의 객체가 메모리에 할당되며 메모리에 할당된 객체의 주소를 a라는 변수가 가리키게 된다.

=는 바인당, 오른쪽 먼저 해석하여 메모리에 3인 정수 타입 객체 할당 -> a라는 변수가 주소 가리킴

id(변수) 내장 함수로 3이라는 객체가 할당된 주소 확인 가능

레퍼런스 카운트

파이썬에서 어떠한 값은 어떤 타입의 객체이다. 정수는 int 타입의 객체, 실수는 float 타입의 객체 예제에서 a라는 변수는 int 타입의 객체 3을 바인딩 하며 int 타입의 객체 3이 메모리에 할당되고 이를 변수 a가 바인딩 하는 것이다. 변수가 어떠한 객체를 바인딩하면 객체의 레퍼런스 카운트 값이 증가한다.

a = 3
sys.getrefcount(a)
sys.getrefcount(3)
// 둘다 같은 값 나옴
>>> 324

위 코드 실행시, a가 바인딩하는 객체인 '3'의 레퍼런스 카운터 값이 화면에 출력된다. 높은 값이 나오는데 이는 이미 파이썬에서 인터프리터가 실행될 때 내부에서 3이라는 값을 여러번 참조했기 때문이다.

다음은 b와c라는 변수도 3을 바인딩하여 레퍼런스 카운터 값의 변화를 볼 것이다.

b = 3
c = 3
sys.getrefcount(3)
>>> 326

기존 324에서 2늘어난 326이 나오는 것을 확인할 수 있다. 이는 b와 c도 객체인 3을 바인딩 하였기 때문에 2만큼 늘어난 것이다.

이번엔 리스트 객체에 대하여 동일한 코드를 실행 하겠다.

a = [0,1,2]
sys.getrefcount(a)
>>> 2

2가 나오는 것을 확인 할 수 있다. sys 모듈의 getrefcount()함수가 호출되면서 해당 객체를 참조하므로 1만큼 레퍼런스 카운트가 증가한다. 때문에 실제로 [0,1,2]라는 리스트 객체에 대한 레퍼런스 카운트는 1이라고 할 수 있다.

레퍼런스 카운트와 Garbage Collection

파이썬에서 모든 값은 어떤 클래스의 인스턴스 이다. 이를 '객체'라고도 하며 객체는 어떤 변수가 자신을 참조할 때 마다 레퍼런스 카운트를 증가시키고 참조가 해제되면 레퍼러너스 카운트를 감소한다. 객체의 레퍼런스 카운트가 0이 되면 파이썬 인터프리터 해당 객체에 대한 메모리 할당을 해제 한다. 이런 방식은 CPython의 가비지 콜렉션의 기본 메커니즘 이다.

0개의 댓글