# 파이썬 튜플



튜플은 몇 가지 특성을 빼면 리스트와 거의 동일하다고 볼 수 있는 자료구조입니다.

인덱싱, 슬라이싱이 가능하고 튜플끼리의 연산 또한 가능하죠.


차이점이 있다면, 리스트는 '[]'을 이용하여 선언하는 반면 튜플은 '()'을 이용해서 감싸줍니다.


1
2
3
4
tup1 = () # 빈 튜플 선언
tup2 = tuple() # 빈 튜플 선언
tup3 = (1,2,3# tup3 == (1,2,3)
tup4 = 1,2,3 # tup4 == (1,2,3)
cs


1. Immutable


튜플은 한번 정의되는 순간 그 요소를 변경하거나, 삭제하는것이 불가능해집니다.

이러한 특성을 영어로는 Immutable하다고 이야기합니다. Immutable한 자료형은 데이터의 오염이 적기 때문에 데이터 분석에서 원시데이터를 저장할 때 자주 쓰입니다.


그렇다면, 한번 테스트를 안해볼 수 없겠죠?


1
2
myTup = ('python',['anaconda','spyder'])
myTup[1= ['man']
cs


이 코드를 실행시키면 인터프리터는 에러를 출력할 것 입니다.


tuple 객체는 새로운 요소의 할당을 지원하지 않는다면서 TypeError가 출력되었습니다. 그러면 진짜로 tuple에서는 값을 전혀 못바꾸는게 확정이네요??  결론부터 말하자면 그렇지 않습니다.


우리는 리스트에서 배웠던 Shallow Copy를 떠올려보셔야 합니다. Shallow Copy는 레퍼런스를 그대로 가져오는 반면 Deep Copy는 값만 복사해 오기 때문에 실질적으로 같은 객체가 아닙니다. 즉 아래와 같은 식이 성립됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
origin = ('python', ['anaconda''spyder'])
clone = ('python', ['anaconda''spyder'])
 
# 값이 같기 때문에 True
origin == clone
 
# 같은 객체가 아니기 때문에 False
origin is clone
 
# Shallow Copy
clone = origin
 
# 같은 값, 같은 객체이기 때문에 True
origin == clone
origin is clone
cs


origin과 clone을 같은 값으로 설정하면 == 에서는 true를 보이지만 is 연산에서는 false를 보입니다. 둘의 레퍼런스 id가 다르기 때문입니다. 하지만 clone에 origin을 대입하면 레퍼런스를 그대로 가져오기 때문에 ==, is 둘 다에서 true를 보이죠? 이 방법을 이용하면 튜플안의 값을 변경할 수 있습니다.

파이썬에서 Immutable이라는것은 어디까지나 레퍼런스가 변경되지 않는다는 의미로만 동작합니다. 즉, 레퍼런스가 변하지 않으면 값이 변해도 상관이 없다는 의미겠죠?


그러면 바로 테스트 해보도록 하겠습니다.


1
2
3
4
5
6
myTup = ('python',['anaconda','spyder'])
myTup[1].append("pig")
print(myTup)
 
# 결과 값
# ('python', ['anaconda', 'spyder', 'pig'])
cs


myTup의 1번째 인덱스에 있는 리스트의 내용이 바뀐것을 확인할 수 있습니다. append는 레퍼런스가 변경되지 않는 대표적인 함수이기 때문에 레퍼런스를 유지 하면서 값을 바꿀 수 있었습니다.


하지만 위에서 처럼 myTup[1]에 = 연산자를 통해 값을 대입하려는 순간 레퍼런스가 변경되기 때문에 TypeError가 발생한 것입니다. 

'Dev > python' 카테고리의 다른 글

[python] 제어문(if, for, while) - 2  (0) 2019.03.23
[python] 제어문(if, for, while) - 1  (0) 2019.02.15
[python] 딕셔너리(dictionary)  (0) 2019.02.13
[python] 리스트 함수  (0) 2019.02.11
[python] 리스트와 Shallow Copy  (0) 2019.02.10

+ Recent posts