티스토리 뷰

Basic

파이썬 변수

nickas 2020. 4. 5. 00:28

변수 선언

파이썬은 아래와 같이 변수 선언

>>> a = 1         # int 형 선언
>>> type(a)       # type() 빌트인 함수를 사용하여 형 확인
int
>>> a
1

>>> a = '1'       # ''를 사용하면 str 형이 선언
>>> type(a)
str
>>> a
'1'
>>> a.isdigit()   # isdigit()를 사용하여 str형이 정수형 str인지 확인 가능
True

>>> a = 'string'  # str 형 선언
>>> type(a)
str
>>> a
'string'

>>> a = 1.23      # floating 형 선언
>>> type(a)
float
>>> a
1.23

>>> a = [1, 2, 3] # list 형 선언
>>> type(a)
list
>>> a
[1, 2, 3]

>>> a = {'a': 1, 'b': 1, 'c': 1}  # dictionary 형 선언
>>> type(a)
dict
>>> a
{'a': 1, 'b': 1, 'c': 1}

def func():
    pass

>>> a = func  # func()를 할당하면 함수가 실행되어 값이 할당 됨.
>>> type(a)
function
>>> a
<function __main__.func()>

파이썬은 다른 프로그래밍 언어와 다르게 변수 선언 시 형(type)을 지정하지 않음.
변수에 어떤 형이 할당되는지에 따라 변수형이 결정됨.

프로그래밍 언어에서 = 기호는 수학기호에서 말하는 똑같다는 의미가 아니고 왼쪽의 값을 오른쪽에 할당하라는 의미. ==이 기호가 똑같다는 의미. 모든 프로그래밍 언어에서 이와 같이 사용.

사실 파이썬은 변수에 어떤 값을 할당할 때 그 값이 할당되는 것이 아니라 값이 실제 저장되어 있는 메모리 주소 정보를 가지고 있음. 즉, a = 1이라고 선언하면 숫자 1은 int()클래스의 인스턴스(인스턴스 오브젝트(객체))가 되고 아래 그림과 같이 변수 aint() 인스턴스의 메모리 주소 정보를 가지게 됨.(C에서는 이것을 pointer라고 부름)

파이썬은 변수 선언 시 형 정의를 하지 않기 때문에 사용 시 주의 필요. 즉, 다른 프로그래밍 언어에서는 int형으로 선언된 변수에 str형을 할당하면 에러를 발생하지만 파이썬은 에러를 발생하지 않을뿐만 아니라 int형 변수가 str형 변수가 됨. 이것을 Dynamic Type이라고 함.
형 검증을 위해 isinstance()라는 빌트인 함수를 사용할 수 있음. isinstance(a, str) 변수 a가 str형일 경우 True를 반환하고, 아닐경우 False를 반환.

그래서 파이썬은 모든 것이 객체라고 하는 것임.

is vs ==

==는 두 변수가 같은 값을 가지고 있는지 확인할 때 사용

>>> a = 1
>>> b = 1
>>> a == b
True

>>> a = 1
>>> b = 2
>>> a == b
False

is는 두 변수가 같은 객체인지 확인할 때 사용

>>> a = 1
>>> b = a  # 변수 b에 1의 값이 할당되는 것이 아니라 1의 메모리 주소(위치)가 할당 됨.
>>> a is b
True

>>> a = 1
>>> b = 2
>>> a is b
False

특이한 경우

>>> a = 1
>>> b = 1
>>> a == b
True
>>> a is b
True

a = 1b = 1은 각각 선언되었기 때문에 각각 별도의 int() 클래스의 인스턴스가 생성됨.
그러나 a is b 리턴 값이 True인 이유는 파이썬 인터프리터가 한번 생성된 인스턴스 오브젝트를 캐싱하고 있다가 다른 변수가 사용 시 재 사용함. 즉, a = 1이 선언될 때 1의 값을 가지고 있는 int() 클래스의 인스턴스가 생성 및 캐싱되고, b = 1 이 선언될 때 이미 만들어진 1의 값을 가지고 있는 int()의 인스턴스를 재 사용함. 그러나 Garbage collection으로 사라진 인스턴스는 재사용할 수 없음.

Garbage collection은 heap 메모리에 생성되어 사용되지 않는 오브젝트를 감지하여 메모리 상에서 지워버리는 CPython의 기능?이고, JAVA의 Garbage collection와 비슷한 기능?이다. 자세한 사항은 어려운 내용이기에 관심 있으면 Google 검색.

'Basic' 카테고리의 다른 글

Set  (0) 2020.04.25
파이썬 Tuple  (0) 2020.04.19
파이썬 Dictionary  (0) 2020.04.19
파이썬 List  (0) 2020.04.12
파이썬 String  (0) 2020.04.11
최근에 올라온 글
글 보관함