파이썬(python) – 리스트(List) 이해하고 활용하기 [첫번째]
이번 시간에는 python 에서 가장 많이 사용하는 List 에 대해 배워보겠습니다.
python 강의를 진행하다보니 제일 와닿은 강의 방법은 간단한 이론 배경을 설명하고 되도록 여러가지 예를 보여주는 방법인 것 같습니다.
List 는 다양한 타입의 값들을 모아둔 것이라고 생각하시면 됩니다. 리스트는 순서있는 문자들의 모둠이라는 점에서 문자열과 비슷하지만 리스트의 원소는 어떤 유형도 될 수 있다는 점이 다릅니다.
이러한 각각의 값들을 원소(element)라고 부르고, 이러한 값들은 지표(Index)를 이용하여 접근할 수 있습니다.
List 를 표현할 때는 대괄호('[]')를 사용합니다.
다음의 예들과 주석들을 하나하나 잘 보시면 List 에 대한 이해를 쉽게 하실 수 있습니다.
아래의 예들은 제가 흐름을 가지고 테스트한 결과이니 쭈욱 흐름대로 보시면 이해하실 수 있습니다.
sh> python
# list 를 사용할 때는 대괄호([] : square bracket)을 사용 >>> [1,2,3] [1, 2, 3] # 숫자 1,2,3 을 list element 로 등록 >>> a = [1,2,3] >>> a [1, 2, 3] # 데이터형을 섞어서 list 에 넣을 수 있음. >>> a = [1,2,'aaaa'] >>> a [1, 2, 'aaaa'] # list 의 첫번째 element 를 리턴 - string 의 문자를 접근하는 방법과 동일 >>> a[0] 1 # list 의 두번째 element 를 리턴 >>> a[1] 2 # list 의 모든 element 를 리턴 >>> a[:] [1, 2, 'aaaa'] # list 의 첫번째 element 값을 변경 >>> a[0] = 13 >>> a [13, 2, 'aaaa'] # string 객체처럼 list 의 길이를 볼 수 있음. >>> len(a) 3 # list 객체인 a 의 symbol list 를 볼 수 있음. >>> dir(a) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] # string 이나 다른 변수의 연산처럼 list 도 동일한 방식으로 연산 가능 >>> [1,2,'aaa'] + [3,4] [1, 2, 'aaa', 3, 4] # list 변수 a 와의 + 연산 >>> a + [3,4] [13, 2, 'aaaa', 3, 4] # list 객체 a 의 count 멤버함수를 사용하는 법을 document 로 확인 >>> help(a.count) # 3 이라는 숫자가 a list 에 몇번 들어있나 확인 >>> a.count(3) 0 # 2 라는 숫자가 a list 에 몇번 들어있나 확인 >>> a.count(2) 1 >>> a = [1,2,3] >>> b = a # 복사를 하는 것이 아니고 단지 b 가 a 객체를 똑같이 가리키도록 (포인터) >>> b [1, 2, 3] # a 의 첫번째 element 값을 변경하니 >>> a[0] = 13 >>> a [13, 2, 3] # b 의 list 도 변경되어 있는 것을 볼 수 있음. >>> b [13, 2, 3] # 마찬가지로 b 를 변경해도 >>> b[0] = 77 # a 또한 변경되어 있음. >>> a [77, 2, 3] >>> b [77, 2, 3] # list a 에 element 를 추가했을 때는 a 에는 적용이 되지만 >>> a = a + [4,5] >>> a [77, 2, 3, 4, 5] # b list 에는 보이지 않음을 주의 >>> b [77, 2, 3] # 다시 할당하면 다시 같아짐. >>> b = a >>> b [77, 2, 3, 4, 5] >>> a [77, 2, 3, 4, 5]
위처럼 b 가 a 를 가리키는 포인터가 아니라 완전히 별도의 list 로 분리 복제하고 싶을 때...
c++ 에서는 이렇게 사용하는 경우들에 있어서 메모리 해제에 대한 신경을 써줘야하지만,
python 은 gabage collector 가 알아서 정리해줍니다. 그냥 마구 사용하면 됩니다.
>>> a = [1,2,3] >>> a[:] [1, 2, 3] # 이렇게 하면 b 영역을 따로 잡고 복제한다. >>> b = a[:] >>> b [1, 2, 3] # a 의 element 를 변경해도 >>> a[0] = 13 >>> a [13, 2, 3] # b 는 변하지 않는다. >>> b [1, 2, 3] # list 가 같은지 확인 >>> a == b False
list 의 element 를 하나씩 자동으로 접근하고 싶을 때는 for 구문을 사용합니다.
>>> a = [1,2,3] # num 변수에 a list 의 element 를 차례로 담아준다. >>> for num in a: print num ... 1 2 3 # 두줄로 나누어쓸 경우 >>> for num in a: ... print num ... 1 2 3
다음 시간에 list 에 대해 좀 더 배워보겠습니다.