파이썬(Python) 기초 - 자료형 활용

170817 (이어서)


자료형의 참과 거짓

자료형의 참과 거짓을 구분하는 기준은 다음과 같다.

참 or 거짓
“python”
”” 거짓
[1, 2, 3]
[] 거짓
() 거짓
{} 거짓
1
0 거짓
None 거짓
a = [1, 2, 3, 4]
while a:
...    a.pop()
...
4
3
2
1
# a가 참인 경우 a.pop()을 계속 실행하라는 while문이다. a가 참인 동안(리스트 내에 요소개 존재하는 한) 마지막 요소를 계속 끄집어내는데, 결국 더 이상 끄집어낼 것이 없으면 a가 빈 리스트([])가 되어 거짓이 되고, while문에서 조건이 거짓이 되므로 중지된다.

if [ ]:
...     print("True")
... else:
...     print("False")
...
False

if [1, 2, 3]:
...     print("True")
... else:
...     print("False")
...
True


자료형의 값을 저장하는 변수

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

변수를 만들 때는 위처럼 =(Assignment) 기호를 사용한다. C, Java 언어와 달리 파이썬은 변수에 저장된 값을 스스로 판단하여 자료형을 알아낸다. 파이썬에서 사용하는 변수는 객체를 가리키기도 한다. 만약에 a = 3이라고 할 때, 3이라는 값을 가지는 정수 자료형(객체)이 자동으로 메모리에 생성된다. 이 때 a는 변수 이름이고, 3이라는 정수형 객체가 저장된 메모리 위치를 가리키게 된다. 즉, 변수 a는 객체가 저장된 메모리의 위치를 가리키는 레퍼런스(Reference)라고도 할 수 있다.

type(3)
<class 'int'>
# type()은 입력받는 객체의 자료형이 무엇인지 알려주는 함수다.

a = 3
b = 3
a is b
True
# 여기서, 3이라는 정수형 객체를 가리키는 변수는 2개다. 이것을 레퍼런스 카운트(Reference Count, 참조 개수)가 2개라고도 한다.

import sys
sys.getrefcount(3)
30
# 파이썬에는 입력한 자료형에 대한 참조 개수를 알려주는 sys.getrefcount() 함수가 있다. 맨 처음에 실행했을 때 30이 나오는 이유는 파이썬 내부에서 3이라는 자료형을 이미 사용했기 때문이다.

a = 3
sys.getrefcount(3)
31
b = 3
sys.getrefcount(3)
32
c = 3
sys.getrefcount(3)
33

파이썬에서 변수를 만드는 방법은 다양하다.

a, b = ('python', 'life')
(a, b) = 'python', 'life'
# 튜플로 a, b에 값을 대입, 튜플은 괄호 생략 가능

[a, b] = ['python', 'life']
a = b = 'python'
# 리스트로 변수를 만들 수도 있다. 여러 개의 변수에 같은 값 대입 가능

a = 3
b = 5
a, b = b, a
a
5
b
3
# 파이썬에서는 a, b의 값을 서로 간단히 바꿀 수 있다.

a = 3을 입력했을 때 3이라는 정수형 객체가 메모리에 생성된다. 이 때 레퍼런스 카운트가 0이 되는 순간 3이라는 객체는 자동으로 사라지고 즉, 메모리에서 사라진다. 이를 가비지 콜렉션(Garbage Collection, 쓰레기 수집)이라고 한다.

a = 3
b = 3
del(a)
del(b)
# 파이썬 내장 함수에 의해 사라졌을 때, 레퍼런스 카운트가 0이 되어 정수형 객체 3도 메모리에서 사라지게 된다. 참고로, 사용한 변수를 del 명령어를 이용하여 일일이 삭제할 필요는 없다. 파이썬이 자동으로 해준다.

리스트 자료형에서 복사할 때 몇 가지 특징이 있다.

a = [1, 2, 3]
b = a
a[1] = 4
a
[1, 4, 3]
b
[1, 4, 3]
# a 리스트의 a[1]을 4로 바꿨을 때, a 리스트만 바뀌는 것이 아니라 b 리스트도 똑같이 바뀐다. a, b 모두 같은 리스트인 [1, 2, 3]을 가리키고 있었기 때문이다. 그렇다면 a가 가리키는 리스트와 다른 리스트를 가리키게 하는 방법은? 아래와 같이 하면 된다.

a = [1, 2, 3]
b = a[:]
a[1] = 4
a
[1, 4, 3]
b
[1, 2, 3]
# [:]를 이용하면 된다.

from copy import copy
b = copy(a)
# copy라는 함수를 사용하면 된다. b = copy(a)는 b = a[:]와 동일하다.

b is a
False
# 두 변수가 같은 값을 가지면서 다른 객체를 제대로 생성했는지 확인한다. is 함수를 사용하면 서로 동일한 객체인지 아닌지에 대해 판단할 수 있다.

다음 시간에는 if, while, for 등 제어문에 대해 알아보겠다.