[Python] 파이썬의 변수와 메모리 할당

sudog·2023년 8월 28일

Python

목록 보기
1/4

파이썬을 공부하다 보면 파이썬에선 모든 것이 객체라는 문장이 나오게 된다. 즉 우리가 단순히 숫자나 문자로만 인식했던 값들이 사실은 클래스로 만들어진 객체임을 의미하는 것이다.

이것을 바로 파이썬에서 확인해 볼 수 있다.

a = 3.0
b = 3.14

if a.is_integer():
    print(f'{a} is integer!')
    
if b.is_integer():
    print(f'{b} is integer too!')
    
# result
3.0 is integer!

is_integer함수는 실수 타입의 숫자가 정수값일 경우 True를 리턴한다. 이것은 객체가 메소드를 사용하는 것과 동일한 방식이다.
즉, 3.0이라는 값은 사실 객체임을 알 수 있다.

또 다음 예제를 보자.

arr = ['five', 'three', 'two']
print('+'.join(arr))

# result
five+three+two

join함수 역시 위의 경우와 마찬가지다. 따라서 문자열 타입 역시 객체인 것을 알았다.


그럼 이제 변수에 객체들이 어떻게 할당되는지 알아보겠다.
파이썬의 메모리 할당 방식은 사람의 직관과 조금 다르다.

대부분의 프로그래밍 언어는 변수에 값을 할당하기 위해 변수가 메모리 공간을 점유하고 그 공간에 값을 대입하는 방식을 사용한다.

하지만 파이썬은 모든 것이 객체이기 때문에 값도 객체이다. 따라서 값이 메모리 공간을 점유하고 변수가 그 객체의 주소를 가리키게 된다.

이해를 위해 예제코드를 보자. id는 해당 변수가 가리키는 객체의 고유 주소값을 반환한다. 변수의 주소라고 생각해도 좋다.

a = 10
b = 12
print(id(a))
print(id(b))
a += 2
print(id(a))

# result
140290496840208
140290496840272
140290496840272

a는 처음에 10이었다가 2를 더해서 12로 만들었다. 그런데 결과를 보면 a의 주소가 변한 것이 확인된다.

이것은 10이라는 객체를 가리키던 a의 주소값이 12라는 객체를 가리키도록 변한 것이라고 이해할 수 있겠다.

또한 b의 주소와 같아진 것이 보이는가?
이것은 효율적인 메모리 관리를 위해 파이썬이 새로운 객체를 만들지 않고 존재하는 객체를 캐싱하여 참조하도록 하기 때문이다.

값이 주소를 갖는다는 개념은 아래 코드를 보면 명확해진다.

print(id(1))
print(id(2))
print(id(1+1))

# result
140633211863280
140633211863312
140633211863312

문자열을 사용한 예시도 살펴보자.

a = 'good'
a += 'bye'
print(f'a: {id(a)}')

b = 'goodbye'
print(f'b: {id(b)}')

c = ''.join(['g', 'o', 'o', 'd', 'b', 'y', 'e'])
print(f'c: {id(c)}')

d = 'good' + 'bye'
print(f'd: {id(d)}')

e = 'good'
e += 'bye'
print(f'e: {id(e)}')

f = 'goodbye'
print(f'f: {id(f)}')

g = ''.join(['g', 'o', 'o', 'd', 'b', 'y', 'e'])
print(f'h: {id(g)}')

# result
a: 139723783697136
b: 139723783159280
c: 139723783697264
d: 139723783159280
e: 139723783697200
f: 139723783159280
h: 139723783697392

위 결과는 상당히 흥미롭다. 모두 같은 'goodbye'문자열 객체이지만 주소가 같은 건 b, d, f밖에 없다.

이것은 문자열의 경우 숫자에 비해 자료의 크기가 크기 때문에 캐싱이 이루어지지 않았기 때문이다.

추측이지만 한번에 'goodbye'를 생성해서 할당하는 방식이 아니거나 join을 사용할 경우 캐싱이 되지 않고 새로운 객체를 생성하는 것으로 보인다.

profile
안녕하세요

0개의 댓글