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_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_a = (1, 2, 3)
tuple_b = (4, 5, 6)
print("before:", id(tuple_a))
tuple_a += tuple_b
print("after:", id(tuple_a))
- 반면 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