Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags
more
Archives
Today
Total
관리 메뉴

민수야, 너도 할 수 있어

Python 공부 (8) - mutable(가변) 과 sequential(순차적) 본문

언어/python

Python 공부 (8) - mutable(가변) 과 sequential(순차적)

devpola 2020. 2. 12. 17:41

가변(mutable) vs. 불변(immutable) 과 순차적(sequential) vs. 비순차적(out of order)

    이번 포스팅에서는 값의 변경이 가능한지, 불가능한지와 요소에 접근하는 방식이 순차적인지 비순차적인지를 기준으로 자료형을 나누어볼것이다.



가변(mutable) vs. 불변(immutable)

  • 객체(Object)

     자료형이 mutable type 인지, immutable type 인지 알기 위해서는 python의 객체(object) 개념을 알아야한다. python에서 객체는 자료형을 포함한 모든 것을 가리킨다. 아래의 코드를 보자.

num = 7

    위의 예제에서 num은 '변수'이고, num이라는 이름을 가진 변수에 대입되는 7은 정수 자료형(객체)이다. 위의 코드를 실행하면, 7이라는 정수형 객체가 자동으로 메모리에 생성되고, 변수 num은 정수형 객체가 저장된 메모리 위치를 가리킨다.



  • is 함수
a = 7
b = 7
print(a is b)    #True

    위 예제 처럼 is 함수가 반환하는 True, False 값을 통해 동일한 객체를 가리키고 있는지에 대해서 알 수 있게된다. 여기서 알 수 있는 점은, 7 이라는 정수형 객체가 처음에 메모리에 할당된 이후로는 똑같은 객체는 더 이상 존재하지 않는다는 것이다. 위 예제에서 b 변수는 새로운 7 정수형 객체를 가리키는 것이 아니라, 기존에 메모리에 할당된 정수형 객체 7을 가리키게된다.



  • mutable, immutable 자료형 구분하기

    자료형의 값을 바꿀 수 있는지, 없는지 판단하기 위해서는 변수에 대입한 값을 수정했을 때, 수정하기 전 변수와 같은 객체를 가리키고 있는지 is 함수를 통해 알아보면된다.

  1. 숫자형(Number)
#숫자형
num1 = 7
num2 = num1
print(num1 is num2)    #True
num1 = 6
print(num1 is num2)    #False
print(num1, num2)    #6 7

    숫자형의 경우, 처음에는 num1, num2 모두 7이라는 정수형 객체를 가리키고 있었다. 하지만, num1에 6이라는 정수형 객체를 대입하면, 7이라는 정수형 객체는 변경할 수 없는 immutable type 이기 때문에 7이 6으로 변경되는 것이 아니라 변수 num1이 새로운 정수형 객체 6을 가리키게 되는것이다.

  1. 문자열(String)
#문자열
str1 = 'hello'
str2 = str1
print(str1 is str2)    #True
str1 = 'world'
print(str1 is str2)    #False
print(str1 str2)    #'world' 'hello'

    문자열 자료형의 경우, 숫자형과 마찬가지로 immutable type이기 때문에, 값의 변경이 불가능하여 str1 변수가 새로운 문자열 객체를 가리키게 되는것이다.

  1. 리스트(List)
l1 = [1,2,3]
l2 = l1
print(l1 is l2)    #True
l1.append(4)
print(l1 is l2)    #True
print(l1, l2)    #[1,2,3,4] [1,2,3,4]

    리스트 자료형의 경우, 위 예제를 통해 mutable type임을 알 수 있다. 애초에 리스트의 값을 변경할 수 있기에, l1의 값을 변경해도 새로운 리스트를 가리키는 것이 아니라 기존의 리스트형 객체가 변경된다. 그렇기에, l2도 따로 변경하지 않아도 기존에 가리키던 객체가 l1을 통해 바뀌었으니 같이 값이 바뀌는 것이 맞는것이다.

  1. 튜플(Tuple)
t1 = (1,2,3)
t2 = t1
print(t1 is t2)    #True
t1 = (1,2,3,4)
print(t1 is t2)    #False
print(a, b)    #(1,2,3,4) (1,2,3)

    튜플 자료형의 경우, 리스트와 사용 방법은 비슷하지만 리스트와 달리 immutable type임을 알 수 있다. 리스트 자료형은 mutable type이기에, append 함수를 통해 요소 변경(추가)이 가능하지만 튜플은 값의 변경이 애초에 불가능하기 때문에 위 예제처럼 새로운 튜플을 대입할 수 밖에 없다.

  1. 딕셔너리(Dictionary)
d1 = {1:'hello', 2:'world'}
d2 = d1
print(d1 is d2)    #True
d1[3] = '!!!'
print(d1 is d2)    #True
print(d1, d2)    #{1:'hello', 2:'world', 3:'!!!'} {1:'hello', 2:'world', 3:'!!!'}

    딕셔너리 자료형의 경우, 리스트 자료형과 마찬가지로 mutable type 이기에, d1의 값을 변경했을 뿐인데, 기존의 가리키고 있던 리스트의 값이 변경된 것이기 때문에 d2의 값도 같이 바뀌게된다.

  1. 집합(Set)
s1 = {1,2,3}
s2 = s1
print(s1 is s2)    #True
s1.add(4)
print(s1 is s2)    #True
print(s1, s2)    #{1,2,3,4} {1,2,3,4}

    집합 자료형의 경우, 위 예제를 통해 mutable type임을 알 수 있다.

    정리하자면, python의 자료형 중, mutable type은 리스트, 딕셔너리, 집합 자료형이다. 그리고 mutable type은 숫자형, 문자열, 튜플 자료형이다. 위 예제들을 통해, 알 수 있는 점은 mutable type에 해당하는 자료형들에는 값을 변경할 수 있는 기능들이 지원된다는 것이다. 예를 들면, 리스트의 append 함수나 집합의 add 함수 등이 있다.



순차적(sequential) vs. 비순차적(out of order)

    자료형을 요소 값에 순차적으로 접근하는 지, 아닌지에 따라 분류를 할 수 있다. 이는 앞서 배운 슬라이싱(Slicing)을 통해 분류할 수 있다. 슬라이싱이 가능한 자료형은 각 요소를 순차적으로 접근하는 sequential type으로 분류한다.여기서, 숫자형은 하나의 객체이기 때문에 분류 범위에서 제외한다.

  • 문자열, 리스트, 튜플
#문자열
s = "hello"
print(s[:4])    #'hell'

#리스트
l = [1,2,3]
print(l[1:2])    #[2]

#튜플
t = (1,2,3)
print(t[1:2])    #(2,)

    위 예제를 통해 문자열, 리스트, 튜플은 sequential type임을 알 수 있다. 각 요소에 순차적으로 접근하기에 요소마다 인덱스(번호)를 매겨 순차적인 묶음을 반환할 수 있는 것이다. 반면에, 딕셔너리와 집합 자료형에 슬라이싱을 하면 TypeError가 발생한다. 딕셔너리와 집합 자료형 모두, 비순차적인 자료형이기 때문에 요소들의 순서가 상관 없다. 실제로, 출력을 했을 때에 기존에 선언한 요소들의 순서와 상관없이 뒤죽박죽으로 출력되는 경우가 있을 수 있다. 또한, 딕셔너리와 집합 자료형은 중복되는 요소를 허용하지 않는다는 공통점도 있다.



    이번에는 자료형들을 분류할 수 있는 여러 기준들을 공부해봤다. 다음에는 제어문에 대해 포스팅을 할것이다. 참고로, 저자는 공부자료로 박응용 저자의 점프 투 파이썬 책을 이용하고 있다. 이는 구글에서도 무료로 볼 수 있으니 공부에 참고하길 바란다.