Python

Python 변수와 메모리

Bithub 2024. 3. 27. 11:28
728x90

객체

Python에서 '모든 것'은 객체다.

변수, 클래스, 객체 모든 것이 객체라고 생각하면 된다.

객체는 변수(상태, 속성)와 메소드(기능)로 구성되어 있다.

 

print((3).bit_length())

num = 3
print(num.bit_length())

str = "three"
print(str.upper())

 

예를 들어, 정수값이 담긴 객체에는 bit_length()와 같은 메소드가 존재하고

문자열이 담긴 객체에는 upper()나 lower()와 같은 메소드가 존재한다.


변수

Python에서 변수 역시 객체다.

다음 코드를 보자.

num = 5

 

위 코드를 실행하면 num이라는 변수에 5가 저장되어 있다고 생각하기 쉽다.

하지만 실제 메모리를 들여다보면 아래 그림과 같다.

 

 

데이터 값 5는 객체에 저장되어 있고 num 변수에는 객체의 위치 정보가 들어있다.

num 변수에 담겨 있는 위치 정보값을 참조하고 싶다면 id() 명령어를 사용하면 된다.

print(id(num))

 

근데 궁금증이 생긴다.

num에는 위치정보가 담겨있는데 왜 num을 출력하면 위치 정보값이 아니라 5가 출력될까?

print(num) # 5

 

그 이유는 변수도 '표현식'으로 해석되기 때문이다.

표현식이란, 어떤 값으로 치환되는 코드다.

예를 들어, print(2 + 3)을 하면 5가 출력되듯이 '2 + 3'도 표현식이다.

 

* 참고

Python에서 변수에는 반드시 초기값을 설정해야 한다.

아무 값도 설정하고 싶지 않다면 키워드 'None'을 사용하면 된다.

num = None
print(num)
>> None

표현식

위에서 언급했듯, 표현식은 어떤 값으로 치환되는 코드를 말한다.

그리고 변수 역시 표현식이라고 언급했다.

근데 대입 연산자 또한 표현식으로 해석된다. (Python 3 버전 한정)

 

a = b = c = d = e = 3
print(a, b, c, d, e)
>> 3, 3, 3, 3, 3

 

위 코드를 보자.

'e = 3'은 '3'으로 치환되어 'd = e = 3'은 'd = 3'으로 해석된다.

결과적으로 a, b, c, d, e 모두 3이 할당되어 정상적으로 출력된다.

def add(a, b):
    return a + b

print((num = add(1, 2)) == 3)
>> error

 

하지만 위 코드는 제대로 실행되지 않는다.

우리가 기대하길 num = add(1,2)가 3으로 치환되어 True가 출력되길 기대한다.

하지만 interpret time에 값이 확정되지 않은 경우, 표현식은 치환의 기능을 하지 못해 에러를 띄우는 것이다.

 

이렇게 interpret time에 값이 확정되지 못하는 경우(위 코드처럼 함수를 실행하거나 사용자로부터 키보드 입력을 받는 경우), walrus operator를 사용한다.

Python 3.8에 도입되었으며, 바다코끼리(walrus)의 이목구비를 옆으로 돌려놓은 듯한 기호(:=)를 갖는다.

 

def add(a, b):
    return a + b

print((num := add(1, 2)) == 3)
>> True