변수 할당
다른 언어의 경우 변수를 사용하기 위해서 미리 선언하고 정의해야 합니다. 파이썬의 경우 이러한 과정은 필요 없습니다.
>>> n = 300
위 코드는 "변수 n에 300을 할당"이라고 해석합니다. 이런 식으로 파이썬은 변수에 값을 바로 할당하여 사용할 수 있습니다.
변수 타입
다른 언어의 경우 한번 선언된 변수의 타입을 사용이 끝날 때까지 지켜야 합니다. 하지만 파이썬의 경우 언제든지 다른 타입을 변수에 할당할 수 있습니다.
>>> var = 23.5
>>> print(var)
23.5 # int
>>> var = "Now I'm a string"
>>> print(var)
Now I'm a string # str
객체 참조
파이썬은 모든 변수가 객체입니다.
>>> print(300)
300
이러한 코드를 수행했을 때, 인터프리터는 아래와 같이 수행합니다.
- 정수 객체를 생성
- 객체에 값 300을 부여
- 콘솔에 표시
type() 함수를 사용하면 정수 객체가 생성된 것을 볼 수 있습니다.
>>> type(300)
<class 'int'>
파이썬에서 변수는 객체에 대한 포인터 역할을 합니다. 아래에 예시를 들어보겠습니다.
>>> n = 300
값 300으로 정수 객체를 생성한 뒤, 변수 n이 해당 객체를 가리키도록 합니다.
>>> m = n
만약, 이런 식으로 변수 m에 변수 n을 할당하면 어떻게 될까요?
하나의 정수 객체 300을 m과 n이 동시에 가리키고 있습니다.
>>> m = 400
이 상황에서 m에 새로운 정수 객체 400을 할당하면 아래와 같이 새로운 객체가 생겨나고, 이를 m이 가리킵니다.
이번엔 n이 새로운 객체를 가리키도록 해보겠습니다.
>>> n = "foo"
정수 객체 300은 포인터가 없어 액세스 할 수 없습니다. 이렇게 참조 수가 0이 된 객체는 더 이상 접근할 수 없음을 파이썬이 알아차리고 할당된 메모리를 회수하여 효율적으로 메모리를 사용할 수 있게 해 줍니다. 이를 가비지 컬렉션이라고 합니다.
객체 아이덴티티
파이썬은 생성되는 모든 객체에 고유하게 식별할 수 있는 번호가 부여됩니다. 수명이 겹치는 기간 동안 두 객체가 동일한 식별자를 갖지 않도록 보장됩니다. 그래서 앞서 보았던 가비지 컬렉션 현상이 일어나면 해당 식별 번호를 다시 사용할 수 있습니다. 이러한 식별 번호는 id() 함수로 확인 가능합니다. id() 함수는 객체의 식별자 번호를 반환합니다.
※ CPython의 경우 식별자 번호가 메모리 주소를 의미합니다.
>>> n = 300
>>> m = n
>>> id(n)
60127840
>>> id(m)
60127840
>>> m = 400
>>> id(m)
60127872
id() 함수를 통해 두 변수가 동일한 객체를 가리키는 것을 확인할 수 있습니다. 또한, m이 가리키는 객체가 달라지면 식별 번호도 바뀌는 것을 확인할 수 있습니다.
일부 정수 값 캐싱
파이썬은 최적화를 위해 [-5, 256] 범위의 정수에 대한 객체의 식별 번호를 미리 정해놓습니다. 따라서 이 범위의 정수 값에 별도의 변수를 할당하면 동일한 식별 번호가 할당됩니다.
>>> m = 300
>>> n = 300
>>> id(m)
60062304
>>> id(n)
60062896
>>> m = 30
>>> n = 30
>>> id(m)
1405569120
>>> id(n)
1405569120
'Language > Python' 카테고리의 다른 글
네이밍 컨벤션 (0) | 2022.05.04 |
---|---|
map object (0) | 2021.09.02 |