• built-in data structure에 대한 정리

Data Type

파이썬에서 데이터 타입을 나누는 기준이 몇가지 있다.


1. Sequence & Collection

Sequence type

Sequence type의 다음과 같은 특징을 갖는 데이터 타입이다.

  1. Membership Operator
    • in keyword 사용 가능 ex) print(x in X)
  2. Size Function
    • len(seq) 로 size 호출 ex) len([1, 2, 3])
  3. Slicing Property
    • 슬라이싱 가능 ex) seq[2:5], seq[:-1]
  4. Iterability
    • 반복문에서 사용 가능

이러한 특징을 가지는 파이썬 데이터 타입은 string, tuple, list, bytearray, bytes 등 5개의 타입이 있다.


Collection Type

Collection type의 특징은 slicing을 제외한 sequence type과 동일하다.

  1. Membership Operator
    • in keyword 사용 가능 ex) print(x in X)
  2. Size Function
    • len(seq) 로 size 호출 ex) len([1, 2, 3])
  3. Iterability
    • 반복문에서 사용 가능

파이썬에는 setdict가 위 타입에 해당된다. 그리고 collection 모듈에서 제공하는 custom type의 데이터도 이에 해당된다.



2. Immutable & Mutable

Immutable

Immutable은 불변형 객체 타입으로 객체가 생성된 이후 그 상태를 변경할 수 없는 디자인 패턴을 의미한다. 파이썬에서는(아마 다른 모든 언어가 동일할 거라 생각한다.) 변수(variable)에 값(value)을 할당할 때

  1. 변수는 값이 저장된 메모리 id를 가르킨다.
    variable -> memory id
  2. 해당 메모리에 우리가 표현(expression)한 값이 저장된다.
    memory id -> value
test_tuple = (1, 2, 3) # 이 한 줄 전체가 expression이다.
print(test_tuple)
# 결과 : (1, 2, 3)

여기서 다른 변수를 다음과 같이 선언해주면 두 변수는 각각 같은 id를 가질까? 아니면 다른 id를 가질까?

test_tuple = (1, 2, 3)
copy_tuple = test_tuple
print(test_tuple, id(test_tuple))
print(copy_tuple, id(copy_tuple))

파이썬의 모든 변수는 객체 참조이기 때문에 a = b라고 선언하면 두 변수는 결국 같은 메모리 id를 참조하게 된다.(같은 id 값을 가진다)

print(test_tuple, id(test_tuple)) # 결과 : (1, 2, 3) 140245805274176
print(copy_tuple, id(copy_tuple)) # 결과 : (1, 2, 3) 140245805274176

여기서 만약 copy_tuple의 값(value)를 임의로 수정한다면 test_tuple에 영향을 끼칠까?

영향을 받아 본 데이터(origin data)와 copy variable모두 값(value)이 바뀌는 타입이 mutable data type 영향을 받지 않아 copy variable만 값이 바뀌면 immutable type이다.

copy_tuple += (4,)
print(test_tuple, id(test_tuple)) # 결과 : (1, 2, 3)    140448870437952
print(copy_tuple, id(copy_tuple)) # 결과 : (1, 2, 3, 4) 140448870741312

위 코드에서 확인할 수 있듯이 copy_tuple id와 value만 바뀐 것을 확인할 수 있다. 즉, tuple은 immutable type이다.
Immutable data type에는 int, float, decimal, bool, string, tuple 그리고 range 등이 있다.


Mutable

Mutable type은 immutable type과 반대로 동일한 상황에서 기존 변수의 값과 복사한 변수의 값 모두가 변하는 type의 데이터를 지칭한다.

test_list = [1, 2, 3]
copy_list = test_list
print(test_list, id(test_list)) # 결과 : [1, 2, 3] 140299094942272
print(copy_list, id(copy_list)) # 결과 : [1, 2, 3] 140299094942272

copy_list += [4,]
print(test_list, id(test_list)) # 결과 : [1, 2, 3, 4] 140299094942272
print(copy_list, id(copy_list)) # 결과 : [1, 2, 3, 4] 140299094942272

예시 코드에서는 copy한 List의 값만 바꿨다. 하지만 결과에서 볼 수 있듯이 기존의 test_listcopy_list 모두 값, id 주소 값이 바꼈다.
이러한 Mutable data type에는 list, dictionary, set 그리고 user-defined class등이 있다.



3. Iterable 근데 이제 Iterator를 곁들인...

Iterable과 Iterator

iterable type는 순차적으로 한 번에 하나의 member를 반환하는 data type를 의미한다. 그리고 iterator는 iterable과 조금 다른 뜻을 가진다. Docs에 나와있는 정의를 보면 An object representing a stream of data. 즉, 데이터 흐름을 나타내는 객체로 설명하고 있다. 정의만 보면 그 차이점을 바로 알기 힘들기 때문에 예시 코드를 들어 확인해보자.

Iterable : 순차적으로 한 번에 하나의 member를 반환하는 객체
Iterator : 데이터 흐름을 나타내는 객체

iterable_list = [1, 2, 3]
iterator_list = iter(iterable_list)

for member1 in iterable_list:
    print(member1, end="") # 결과 : 123
for member2 in iterator_list:
    print(member2, end="") # 결과 : 123

두 개의 for문 모두 1, 2, 3을 순차적으로 표시해준다. 여기까지도 큰 차이를 보이지 않지만, 동일한 for문을 한번 더 반복하면 그 차이를 명확히 알 수 있다.

for member1 in iterable_list:
    print(member1, end="") # 결과 : 123
print("\n")

for member2 in iterator_list
    print(member2, end="") # 결과 : 123
print("\n")

for member1 in iterable_list:
    print(member1, end="") # 결과 : 123
print("\n")

for member2 in iterator_list:
    print(member2, end="") # 결과 :

위 코드를 실행하면 마지막 네번 째 for문은 아무런 결과도 보여주지 않는 걸 알 수 있다. 즉, iterator는 해당 객체가 모든 member를 반환하면 더이상 아무것도 반환하지 않는다.

조금 더 깊게 보자면 iterability 속성을 가지고 있는 모든 객체를 for문에 사용할 때 iterator 객체로 변환한 후 iterator의 method를 사용해 member를 하나씩 반환하는 구조로 되어있다.
iterable_obj -(type 전환)-> iterator_obj -> 반복문 활용

그리고 정확히 확인해보지 못했지만 comprehension도 내부에서 코드가 돌아갈 땐 기존의 iterable data를 iterator로 변환해 사용하지 않을까 싶다.
Iterator data type에는 Iterbility 특징을 가지는 모든 data type 즉, string, tuple, list, bytearray, bytes, set 그리고 dict등 이다.



thumbnail image source : https://www.edureka.co/blog/data-structures-in-python/

profile
안녕하세요 :) 1년 차 Pythonist 백엔드 개발자 윤서준입니다.

0개의 댓글