알고리즘 공부/파이썬 알고리즘 인터뷰

파이썬 알고리즘 인터뷰 - 자료형

환성 2022. 1. 22. 11:05
728x90

파이썬의 자료형

매핑

  • 키와 자료형으로 구성된 복합 자료형(파이썬에 내장된 유일한 매핑 자료형은 딕셔너리)

 

집합

  • set이라고 쓰고 중복된 값을 갖지 않는 자료형
  • 딕셔너리와의 차이점은 딕셔너리는 키/값 형태이지만 집합은 값만 선언한다
  • 입력 순서가 유지되지 않으며, 중복된 값이 있을 경우 하나의 값만 유지한다

 

시퀀스

  • 특정 대상의 순서 있는 나열
  • 파이썬에서는 list라는 시퀀스 타입이 배열의 역할을 수행한다
  • 불변, 가변으로 구분 가능하고 불변은 값 변경이 X(str, tuple, bytes)

 

원시타입

C 언어에서 제공하는 원시 자료형

  • C나 자바 같은 프로그래밍 언어는 기본적으로 원시 타입을 제공하지만 파이썬의 경우 제공하지 않는다.
  • 원시 타입은 메모리에 정확하게 타입 크기만큼의 공간을 할당하고 그 공간으로 값으로 채워넣는다.
  • 원시 타입을 제공함으로써 C나 자바는 매우 빠른 연산이 가능하다
  • 배열일 경우 밑 그림처럼 물리 메모리에 자료형의 크기만큼 공간을 갖는 요소가 연속된 순서로 배치된다.

물리 메모리에 배치된 배열 

 

객체

  • 파이썬은 앞서 설명했던 C나 자바와 달리 객체를 사용하고 불변 객체, 가변 객체로 나눌 수 있다.
클래스 설명 객체 종류
bool 부울 불변 객체
int 정수 불변 객체
float 실수 불변 객체
list 리스트 가변 객체
tuple 튜플 불변 객체
str 문자 불변 객체
set 집합 자료형(중복 x) 가변 객체
dict 딕셔너리 가변 객체 

 

불변 객체

  • 위의 그림과 같이 10이라는 숫자가 있다. 이제 이 10을 a 변수에 할당하고 b 변수는 a 변수에 할당했다.
  • 만약 모두 원시 타입이라면 각각의 값들은 각 메모리의 다른 영역에 위치할 것이다. 하지만 파이썬은 모든 것이 객체이고 메모리 상에 위치한 객체의 주소를 얻어오는 id() 함수를 실행한 결과는 모두 동일하다. 만약 10이 11이 된다면 a, b변수 모두 값이 11로 바뀌게 될 것이지만 숫자와 문자는 불변 객체이므로 바뀌지 않는다. 값을 담고 있는 변수는 사실 참조일 뿐이고 실제로 값을 갖고 있는 int와 str은 모두 불변 객체이다.

 

가변 객체

  • 변수 a는 list이고 b에는 a를 할당하여 참조가 되게 했다. 이제 list인 a의 요소 하나를 조작해서 값을 변경했다. 그에 따라 b의 값도 같이 변경됐다. list는 가변 객체이므로 이런 일이 가능하다.

 

 

속도

 C의 정수형과 파이썬의 정수형 구조 

  • 파이썬의 객체 구조는 잘 설계되어 있고 매우 편리한 기능을 제공하지만 속도가 다른 언어에 비해 뒤 떨어진다.
  • 단순히 정수형의 덧셈 연산을 하는 경우에도 메모리에서 값을 꺼내 한번 연산하면 끝인 원시 타입에 비해, 위의 그림과 같이 파이썬의 객체는 값을 꺼내는데 만 해도 var -> PyObject_HEAD에서 타입코드를 찾는 등 여러가지 작업이 필요하다. 자바 또한 원시 타입이 아닌 객체로 계산시 속도가 느려지지만 자바는 원시 타입도 함께 제공하기 떄문에 속도를 위해서라면 원시 타입으로 계산한다.

 

 

is와 == 

is는 id() 값을 비교하는 함수다. None 같은 경우는 널(null)로서 값 자체가 정의 되어 있지 않으므로 ==으로 비교가 불가능하다.

if a is None:
	pass

==는 값을 비교하는 연산자이다. 예를 들어 설명하겠다.

값은 동일하지만 list()로 한번 더 묶어주면, 별도의 객체로 복사가 되고 다른 ID를 갖게 된다. 따라서 is는 False가 된다.

copy.deepcopy()로 복사한 결과 또한 값은 같지만 ID는 다르기 때문에 각각 출력값이 다르다.