A. Programming/Python

[파이썬 기초] 인덱싱(Indexing), 슬라이싱(Slicing), 불변(immutable), 가변(mutable)

_DK_ 2021. 8. 13. 12:00
반응형
배우지 않으면 곧 늙고 쇠해진다.
- 주자

 

 인덱싱(Indexing), 슬라이싱(Slicing), 불변(immutable), 가변(mutable)


  이전 글에서는 파이썬에서 사용되는 자료형에는 어떤 것들이 있는지에 대해서 알아보았습니다.
[A. Programming/Python] - 파이썬(Python) 기초 - 자료형과 변수

 

파이썬(Python) 기초 - 자료형과 변수

언젠가 날기를 배우려는 사람은 우선 서고, 걷고, 달리고, 오르고, 춤추는 것을 배워야 한다. - 니체 이전 글들을 통해 파이썬 코딩을 시작하기 전 알아두면 좋다고 생각되는 PEP8, PyLint, Docstring,

yongbba.tistory.com


  이번에는 자료형에 대해서 설명할 때 나온 몇 가지 용어에 대해서 알아보려고 합니다.

 

 가변(mutable) / 불변(immutable)

 

  파이썬은 자료형은 하나의 객체(Object)라고 볼 수 있으며, 각 객체는 Value(메모리에 저장되는 값), Type(객체의 유형), Identity(객체가 가진 고유한 ID, 일종의 메모리 주소)의 특성을 가집니다.

  이중 Identity가 유지된 채로 Value를 바꿀 수 있는지에 따라서 가변과 불변을 구분하며, 자료형에 따라 아래와 같이 구분할 수 있습니다.

가변 : list, set, dict
불변 : int, float, bool, tuple, str

  다시 말하면, 해당 자료형으로 생성된 객체(변수)의 값을 메모리 주소의 변경이 일어나지 않고 바꿀 수 있는지에 따라서 구분이 됩니다. 여기서는 비슷하게 자주 사용되는 리스트(list)와 튜플(tuple)을 비교해보면서 차이를 알아보도록 하겠습니다.(변수가 선언되면 메모리에 할당(identity)이 되는데 id() 함수를 통해서 그 정보를 알아볼 수 있습니다.)

a = [1, 2, 3, 4, 5] b = (1, 2, 3, 4, 5) type(a) id(a) type(b) id(b)

 


  위와 같이 리스트 객체 하나와 튜플 객체 하나를 만든 후 객체의 값을 변경해보도록 하겠습니다.

a[1] = 6 id(a) print(a) b[1] = 6 id(b) print(b)

 


  리스트 객체의 경우에는 두 번째 항목의 값이 변경이 되고 id() 함수의 값 또한 동일한 것을 확인할 수 있습니다. 이와 달리 튜플 객체의 경우에는 두 번째 항목의 값을 변경하려고 하자 오류가 발생하는 것을 볼 수 있습니다.(변경이 되지 않았기 때문에 id() 함수의 결과와 튜플 객체의 값도 그대로 유지가 되었습니다.) 다른 방법을 이용해서 튜플 객체의 값을 바꿔보도록 하겠습니다.

id(b) b = (1, 6, 3, 4, 5) print(b) id(b)

 


  튜플 객체의 값을 바꾸기 위해서는 새로운 튜플 객체를 대입하여야 하는데 id() 함수를 통해 보면 값이 달라진 것을 알 수 있습니다.

 


  위에서 알아본 바와 같이 가변인 경우에는 간단하게 값을 변경할 수 있지만, 불변인 경우에는 값을 변경하기 위해서 새로운 객체를 생성해서 대입하는 과정이 이루어집니다. 문자열(str) 또한 불변이므로 값을 변경하시려면 새로운 문자열을 작성해야 하며, 아래와 같이 확인해보면 튜플 객체와 동일한 속성을 가진 것을 알 수 있습니다.

c = "Hello, World" id(c) c[1] = "a" print(c) id(c) c = "Hallo, World" print(c) id(c)

 

 

 

 인덱싱(Indexing) / 슬라이싱(Slicing)


  파이썬 자료형 중 집합(set)의 경우에는 데이터의 순서가 정해져 있지 않습니다. 이와는 달리 문자열(str), 리스트(list), 튜플(tuple)의 경우에는 데이터의 순서가 있기 때문에 인덱싱과 슬라이싱을 할 수 있으며, 시퀀스(sequence) 자료형이라고 부릅니다.(사전(dict)의 경우에는 orderedDict를 사용하여야 했지만 Python3.6부터는 순서가 있도록 변경되었습니다.)

 

 

 인덱싱(Indexing)


  시퀀스 자료형의 경우에는 각 요소마다 순서대로 번호가 부여되어 있으며, 이를 인덱스(Index)라고 부릅니다. 인덱싱은 이 인덱스를 통해 해당 데이터에 접근하는 방법이라고 볼 수 있습니다. 파이썬은 순서대로는 양수 인덱스(0부터)를 통해, 역순으로는 음수 인덱스(-1부터 역순으로)를 통해 데이터를 활용할 수 있습니다. 음수 인덱스를 지원하는 것이 파이썬의 특징이라고 볼 수 있습니다.

str = "Hello, World" print(str[0]) print(str[1]) print(str[-1]) print(str[-2])

 


  위와 같이 문자열 객체에서 인덱스를 통해 하나하나의 문자를 사용할 수 있으며, 리스트나 튜플 객체도 이와 동일하게 가능합니다.

list = [1, 2, 3, 4, 5] print(list[0]) print(list[1]) print(list[-1]) print(list[-2])

 

 

 슬라이싱(Slicing)


  슬라이싱은 인덱스를 이용하여 특정 범위의 데이터만을 이용하는 방법이라고 볼 수 있습니다. 파이썬은 매우 다양한 방법의 슬라이싱을 지원하고 있으며, 이를 잘 활용한다면 효율적인 프로그래밍이 가능합니다.

str = "Hello, World" print(str[0:5]) print(str[-5:]) print(str[3:-1]) print(str[3:])

 


  위의 예제와 같이 문자열 객체에서 일부분만을 가져와서 사용할 수 있으며, 음수 인덱스를 이용할 수도 있습니다. 추출된 값을 보면 [A:B]에서 A에서 B인덱스까지의 값을 가져오는 것이 아니란 것을 알아두어야 하며, B를 적지 않거나 A를 적지 않는 것도 물론 가능합니다.

list = [1, 2, 3, 4, 5, 6, 7, 8] print(list[1:5:1]) print(list[1:5:2]) print(list[6:1:-1]) print(list[::-1])

 


  위와 같이 리스트 객체나 튜플 객체도 가능하며, 인자를 하나 더 주어서 인덱스가 2씩 증가되거나 역순으로 데이터를 선택할 수 있도록 해줍니다.(여기서 설명한 것은 일부분이므로 여러 가지 경우를 다 해보면서 직접 알아보는 것이 가장 좋다고 생각합니다.)

 파이썬의 특징을 잘 활용하기 위해서...

 

  파이썬은 다양한 자료형을 제공하기 때문에 그 특징을 잘 이용하여 프로그래밍하는 것이 중요합니다. 프로그래밍 언어의 특징을 잘 활용한다면 누군가는 10줄이 넘게 작성한 코드를 2줄 만에 작성할 수도, 또 1000줄이 100줄이 될 수도 있습니다.

  이번에는 파이썬 언어 중에서 가장 중요하고 많이 활용되는 인덱싱과 슬라이싱 등의 개념을 알아봄으로써 앞으로 하게 될 프로그래밍 과정에서 이해를 조금 더 할 수 있도록 따로 이야기를 해보았습니다. 프로그래밍 언어를 잘 쓰고 잘하기 위해서는 다른 사람의 코드도 많이 보고 스스로도 코드를 많이 작성해보는 것이 중요하다고 생각합니다.(여기에서는 일부분만을 다루었지만 여러 가지 시도도 해보면서 어떤 것들은 되는지, 어떤 것들은 안 되는지에 대해서 스스로 알아가 보는 시간을 가진다면 더 빠르게 스킬을 향상할 수 있다고 생각합니다. 파이썬의 장점 중 하나인 인터프리터를 통해서 바로 실행 결과를 알아볼 수 있기 때문에 더욱더 효과적이라고 생각합니다.)

 

 

 

반응형