복습용/초보자 참고를 목적으로 포스팅합니다.
최근 들어 프로그래밍 언어들 중 직관적인 표현으로 코딩이 가능한 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는 서로 다른 객체를 가리키는 것을 알 수 있습니다.
'Programming > [Python]' 카테고리의 다른 글
[Python] 함수 - arguments (0) | 2021.07.17 |
---|---|
[Python/점프 투 파이썬 복습] 2. (6) Python 프로그래밍 자료형 연습문제 (0) | 2021.02.23 |
[Python/점프 투 파이썬 복습] 2. (4) Python 프로그래밍 자료형(집합 자료형) (0) | 2021.02.19 |
[Python/점프 투 파이썬 복습] 2. (3) Python 프로그래밍 자료형(튜플, 딕셔너리 자료형) (0) | 2021.02.18 |
[Python/점프 투 파이썬 복습] 2. (2) Python 프로그래밍 자료형(리스트 자료형) (0) | 2021.02.15 |