레이블이 tuple인 게시물을 표시합니다. 모든 게시물 표시
레이블이 tuple인 게시물을 표시합니다. 모든 게시물 표시

2021년 10월 9일 토요일

python (tuple) 자료구조-튜플

튜플

앞에서 리스트에 대해서 공부했습니다. 리스트 개념은 자료구조에 대해서 공부한 사람이라면 누구나 예상 가능한 형태입니다. 그런데 튜플이란 뭘까요?

이해하기 쉽게 한줄로 승부를 걸겠습니다.


...

...

제가 나름대로 정리해본 그것은

...

...

List의 축소판, List와 성질은 같으나 값을 변경할 수 없는 자료 구조 입니다.


튜플값 정의

( ) 를 사용할수도 있고 없이도 사용할 수 있습니다.

>>> a = (1,2,3)
>>> a
(1, 2, 3)
>>> a = 1,2,3
>>> a
(1, 2, 3)

아래 예제를 보겠습니다. b는 list이고 a는 tuple 입니다. 

>>> b=[1,2,3]
>>> b.append(4)
>>> b
[1, 2, 3, 4]

>>> a=1,2,3
>>> a
(1, 2, 3)
>>> a.append(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
>>> a
(1, 2, 3)

tuple 는 값을 추가하는것을 할 수 없습니다. 물론 삭제도 안되고요. 값 변경도 안됩니다.

>>> b[0]=10
>>> b
[10, 2, 3, 4]

>>> a[0]=10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> a
(1, 2, 3)
>>> a[0]
1

내부 항목 access는 list처럼 []를 이용하여 인덱싱이 가능합니다. 결과를 놓고보면 단순 사용은 list와 동일합니다. 그런데 왜 이런 자료형을 만든것일까요?

생각해보면 단순합니다. C 언어를 사용했던 사람이라면 알고 있다면 const 지시어를 왜 만들었을까요? java의 static final 이 왜 있을까요? 

약간 성격이 다를 수 있지만, C언어의 const 경우 RO 영역에 배치를 한다던가 해서 얻는 이득이 있을겁니다. 하지만 python은 애초에 컴파일해서 RO영역에 배치하는 그런 언어들이 아니기 때문에 그런 부분에 이득을 얻을려고 하는것은 아닐 겁니다. 결국 생각 해볼 수 있는 것은 속도나 인간이 잘못해서 변경하는 부분을 방지하는 차원일것이라 예상해볼 수 있습니다.

stackoverflow 검색해보면 속도면에서 이득이 있다라는 댓글이 있습니다.


언패킹

튜플이나 리스트 모두 지원합니다.

>>> a,b,c=[1,2,3]
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c=(1,2,3)
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c=1,2,3
>>> a
1
>>> b
2
>>> c
3

함수의 값을 리턴할때 많이 사용합니다.

많은 언어들이 return type이 하나이지만 python은 튜플을 이용해서 여러개가 처리가 가능합니다.

return a,b,c 이런식으로 처리하면 받는쪽에서는 튜플 형태로 리턴이 됩니다.