본문 바로가기

파이썬/사용법

[python] 파이썬이 변수를 할당하는 방식

안녕하세요!

이번 글에서는 파이썬이 함수 내에서 변수를 할당하는 방식에 대해서 알아보려고 합니다.

 

1) 변수를 할당하는 방식

2) 메모리 주소와 타입을 알아내는 방법

 

순으로 알아보겠습니다.


 

1) 변수를 할당하는 방식

파이썬은 모든 것이 객체이다.라는 말을 들어보셨나요?

 

아직은 잘 모르시겠지만 이 글을 다 보고 나면

파이썬이 왜 모든것이 객체인가에 대한 맥락을 잡아가실 수 있습니다.

 

우리가  값을 할당할 때 내부적으로는 어떤 일이 벌어질까요?

 

 

우리는 파이썬에서 변수에 값을 할당할 때 

variable_name = value(data) 이런 식으로 할당합니다.

a = 7

 

a = 7과 같이 정수 7을 변수 a에 할당하면, a는 정수형(int type)의 7이라는 값을 가진 객체로 생성됩니다. 
이 객체는 이름(name)은  'a', 타입(type)은  int, 값(value)은 7, 

그리고 해당 객체가 저장된 메모리 주소(memory address)를 가지게 됩니다.

이외에 추가적으로 가비지 컬렉션과 레퍼런스 카운트, 객체의 메서드까지 함께 오브젝트에 바인딩됩니다.

 

object에 name binding을 끝내고 나면 namespace에 등록을 합니다.

 

a는 7이라는 값을 가진 것이 아니라

int type의 object를 가리키고 있는 것이며 object가 a라는 이름의 식별, 타입과 메모리의 주소를 가지고 있고

메모리의 주소를 따라가면 7이라는 값이 있는 것입니다.

 

객체를 구분하고 관리, 메모리사용을 최적화하기 위한 여러 가지 것들과 바인딩을 해서 object로 묶어 놓고 

필요할 때마다 가져와서 사용하는 메커니즘입니다.

파이썬에서 변수를 식별자로 찾아가서 값을 가져오는 방식은 variable referencing, variable resolution이라고 부릅니다.

 

 

 

2) 메모리 주소와 타입을 알아내는 방법 

type() 메서드와 id() 메서드를 사용해서 파악할 수 있습니다.

추가적으로 클래스 메서드에서 가져온 것인데.

class.mro() 메서드로 어떤 함수를 상속받아서 사용하는지 까지 알 수 있는데요

결과로 보면 끝은 전부다 object입니다.

 

 

a = 7
print(type(a))
print(id(a))
print(globals()) # namespace 확인 dictionary type
print(str.mro())
print(int.mro())

# <class 'int'>
# 140707211826152
# {..., ..., ..., 'a': 7}
# [<class 'str'>, <class 'object'>]
# [<class 'int'>, <class 'object'>]

 


 

정리)

변수 바인딩 시 

오브젝트에 object < name, type , memory address, 가비지컬렉션, 레퍼런스 카운트, 메서드> 등을 저장하고 

필요할 때마다 메모리 주소로 찾아가서 값을 가져오는데 이를 variable referencing , variable resolution이라고 부른다.

마치면서)

저도 변수 바인딩이라는 것을 알아보면서 생각보다 내가 모르는 부분이 많았고 

파이썬의 모든 것은 왜  object 인지 맥락을 알게 되었습니다.


파이썬 python name binding로 예제를 찾아보시면 더욱 자세한 정보를 얻을 수 있습니다. 

다음 글에서도 유용한 파이썬 팁과 기능을 소개하도록 하겠습니다

감사합니다.