본문 바로가기

Programming/[Python]

[Python/점프 투 파이썬 복습] 2. (5) Python 프로그래밍 자료형(변수)

복습용/초보자 참고를 목적으로 포스팅합니다.

 

최근 들어 프로그래밍 언어들 중 직관적인 표현으로 코딩이 가능한 Python이 인기를 끌고 있습니다.

 

코드 구성의 가독성이 타 언어 대비 뛰어나고, C/C++/JAVA 에서 구현 가능한 모든 것들을 Python에서도 만들 수 있습니다.

데이터 분석부터 머신러닝, 딥러닝 등 다양한 분야에서 활용 가능한 언어 Python 지금부터 차근차근 공부해봅시다.

 

 

2. (5) 자료형(변수)

 

2. 7 자료형의 값을 저장하는 공간, 변수

 

앞 내용들에서 이미 변수를 여러 번 사용했습니다.

이제는 그 변수들의 정확한 의미와 사용법을 살펴보겠습니다.

 

변수를 만들 때는 예시처럼 =(assignment)기호를 사용합니다.

# 변수 정의

a = 1
b = "Python"
c = [1, 2, 3]

변수란?

 

파이썬에서 사용하는 변수는 객체를 가리키는 것이라고도 말할 수 있습니다.

객체란 자료형을 포함한 파이썬에서 사용되는 모든 것을 뜻하는 말입니다.

a = 3

위의 코드는 3이라는 값을 갖는 정수 자료형(객체)이 자동으로 메모리에 생성되어

a는 변수의 이름이 되고 3이라는 정수형 객체가 저장된 메모리의 위치를 가리키게 됩니다.

즉, 변수 a는 객체가 저장된 메모리의 위치를 가리키는 레퍼런스(Reference)라고 할 수 있습니다.

레퍼런스라는 말이 잘 와닿지 않는다면 위의 그림처럼 'a가 3이라는 객체를 가리킨다'라고 생각해도 무방합니다.

여기서 3은 상수가 아닌 정수형 객체임을 인지해야합니다.(class integer)

 

다음으로 여러 변수가 동일한 객체를 가리키는 경우입니다.

# 여러 변수가 동일 객체를 가리킬 경우

a = 3
b = 3

a is b # a와 b가 동일 객체를 가리키는가? True

예시 결과처럼 두 변수 모두 3이라는 동일 객체의 메모리 주소를 가리키므로 True라는 결과가 도출됩니다.

이때 3을 가리키는 변수에 개수는 2개입니다.
같은 의미로 이때의 레퍼런스 카운트(Reference Count, 참조 개수)는 2개라고 말합니다.

 

 

만약 c = 3이라는 코드가 한 줄 더 추가된다면 레퍼런스 카운트는 3이 될 것입니다.


변수를 만드는 여러 가지 방법

 

변수는 튜플, 리스트 등 여러 개의 값을 대입할 수 있습니다.

# 튜플

a , b = ('python', 'life')

# 리스트

[a, b] = ['python', 'life']

# 여러개의 변수에 같은 값 대입

a = b = 'python'

# 두 변수의 값을 간단히 바꾸기

a = 3
b = 5

a, b = b, a
a # 5
b # 3

마지막 예시 같은 경우 a와 b의 값이 처음엔 3, 5 였지만

이후 문장을 수행한 후에 값이 서로 바뀌었음을 알 수 있습니다.


메모리에 생성된 변수 없애기

 

우리는 a = 3을 입력했을 때 3이라는 정수형 객체가 메모리에 생성되는 것을 알고 있습니다.

이때 3이라는 객체를 가리키는 변수들의 개수를 레퍼런스 카운트라고 하는 것도 학습했습니다.

그렇다면 레퍼런스 카운트가 0 일 때는 어떤 일이 발생할까요?

 

3이라는 객체를 가리키는 변수가 하나도 없을 때(= 레퍼런스 카운트가 0) 3이라는 객체는 메모리에서 삭제됩니다.

이것을 가비지 컬렉션(Garbage collection, 쓰레기 수집)이라고 합니다.

# 특정한 객체를 가리키는 변수 없애기

a = 3
b = 3

del(a)
del(b)

리스트를 변수에 넣고 복사하고자 할 때

 

이 부분은 처음 접할 때 혼동할 수 있기 때문에 그림과 함께 설명하겠습니다.

우선 코드를 먼저 살펴보겠습니다.

# 두 변수 모두 같은 객체를 참조할 경우

a = [1, 2, 3]
b = a

a[1] = 4

a # [1, 4, 3]
b # [1, 4, 3] 

예시를 보면 a를 [1, 2, 3]으로 선언하고 b = a라는 문장을 실행한 후

a의 1번 인덱스 자리에 4를 삽입할 경우

a와 b 모두 결과가 같은 것을 알 수 있습니다.a 와 b는 완전히 동일한 객체(리스트)를 가리키고 있기 때문에 이러한 결과가 도출됩니다.

그렇다면 b변수 생성 시 a변수와 같은 값을 가지도록 하면서
서로 독립된 객체를 가리키게 하는 방법을 살펴보겠습니다.

# [:] 이용

a = [1, 2, 3]
b = a[:]

a[1] = 4

a # [1, 4, 3]
b # [1, 2, 3] 

위 예시를 보면 a를 [1, 2, 3]으로 선언하고 b = a [:]라는 문장을 실행한 후

a의 1번 인덱스 자리에 4를 삽입할 경우

a와 b의 결과가 다른 것을 알 수 있습니다.

그림으로 보면 다음과 같습니다.

그림처럼 a와 b는 엄연히 다른 메모리 주소의 객체를 참조하기 때문에

a가 가리키는 객체의 값이 바뀌더라도b에는 영향을 끼치지 않습니다.

 

이번엔 [:]를 이용하는 대신 모듈을 import 하여 copy함수를 통해a와 b를 비교해보겠습니다.이때 b = copy(a)는 b = a [:]와 같은 의미입니다.(모듈과 라이브러리 개념은 추후 자세히 포스팅하겠습니다.)

# copy 모듈 이용

from copy import copy

a = [1, 2, 3]

b = copy(a)

b is a # False

위 예시 결과를 보면 False를 리턴하므로

a와 b는 서로 다른 객체를 가리키는 것을 알 수 있습니다.