Python 기본 자료구조 - list, tuple, set, dictionary

List와 Tuple

List와 Tuple의 공통점

  • 다른 type의 데이터를 담을 수 있다.
    • ["string", 1, 2]
    • ("string", 1, 2)
  • 여러 데이터를 담을 수 있다.
  • iterable(반복문으로 요소를 하나하나 꺼내 돌리기 가능)하다.
  • 순서(idx)가 있다.
  • 리스트 + 리스트, 튜플 + 튜플 은 되지만, 리스트 - 리스트, 튜플 - 튜플 은 안된다

List와 Tuple의 차이점

  • list는 []로 값들을 둘러싸지만 tuple은 ()로 값들을 둘러싼다.
  • list는 mutable(가변)하지만, tuple은 immutable(불변)하다.
    • list는 list.append()list.remove() 등의 방법으로 해당 list 자체의 값을 수정할 수 있다.
    • 반면, tuple은 list와 같은 append(), remove()로 수정할 수는 없다.
    • 다만 다음과 같은 트릭으로 수정된 효과를 낼 수 있음
      • tuple의 값을 새로운 list에 복사하고 수정한 뒤 새로운 tuple에 list의 값을 할당 <- 결국 list에서 한거
    • 또한 tuple 끼리 더하기(+, concaternation)는 가능 ⇒ append와 유사

mutable(가변) vs immutable(불변)

  • list, set, dict 은 mutable vs tuple은 immutable
  • mutable은 값이 변한다는 뜻이고, immutable은 값이 변하지 않는다는 의미
  • list => mutable
  • dictioary => mutable
  • tuple => immutable

Tuple은 immutable(불변)이라며? tuple 끼리 더하기는 왜 됨?

  • 일단 immutable이라 append(), remove() 메소드가 없다는 것을 다시한번 생각하자.
  • 더하기가 된 것처럼 보이나 실제로 tuple이 수정된 건 아님
# list의 더하기
list_a = [1, 2, 3]
list_b = [4, 5, 6]

print("before:", id(list_a))

list_a += list_b

print("after:", id(list_a))

# 결과
before: 140718837238112
after : 140718837238112
  • list에 +연산을 해도 위와 같이 list_a의 id(메모리 주소) 값은 동일하다. 즉, 동일한 메모리 공간에 담겨 있다.
    • id() 함수를 이용해서 변수의 메모리 주소를 확인할 수 있다.
# tuple의 더하기
tuple_a = (1, 2, 3)
tuple_b = (4, 5, 6)

print("before:", id(tuple_a))

tuple_a += tuple_b

print("after:", id(tuple_a))

# 결과
# before: 2852015629312
# after : 2852015230784
  • 반면 tuple의 경우 + 연산 전후의 tuple_a의 메모리(id 값) 주소가 다르다.
  • 즉, tuple 자체를 수정할 수는 없으므로 tuple에 +연산을 하면
    • 파이썬이 새로운 메모리 공간에 tuple을 만들면서
    • 새로운 tuple에 더해지는 tuple들의 요소를 담은 뒤
    • 거기에 기존의 tuple 변수 이름을 붙여준 것이다.
    • 결과적으로 tuple은 + 연산으로 인해 수정(mutable)된 것이 아니라, 편의를 위해 수정된 것 처럼 보인 것일 뿐, 본질적으로는 불변(immutable)의 성질때문에 재창조(?) 됐다고 생각하자.

왜 굳이 분리했나?

  • tuple로 선언해 놓으면 개발자가 의도치 않은 값의 수정을 막을 수 있다!
  • 돌다리가 옆에 있는데 왜 굳이 흔들다리를 건너야 겠는가?

Set vs Dictionary

Set과 Dictionary의 공통점

  • 중복이 불가능한 collection 자료형이다.

Set과 Dictionary의 차이점

  • set은 key값만 존재한다.
  • dictionary는 key값으로 value값을 찾아내는 해시테이블(Hash Table) 구조이다.
  • dictionary는 key값은 immutalbe 형식이어야하고, value값은 mutable 형식이여도 된다.
    • key값으로 string, tuple은 가능
    • key값으로 list는 불가 => list는 mutable이기 때문에
  • set은 가변(mutable)하다.

References

좋은 웹페이지 즐겨찾기