[List] 파이썬 List 완전 정복 - 기초편

공식문서(영문)

class list([iterable])

먼저 list를 만드는 방법에는 여러가지가 존재하는데:

  • 꺿쇠괄호(...?) 만 가지고 빈 리스트 생성 : []

  • 꺿쇠괄호로 오브젝트 또는 콤마로 구분된 여러 오브젝트들을

    둘러싸서 리스트 생성: [1] 또는 [1,2,3]

  • List Comprehension[각주:1] 으로 생성: [x for x in iterable]

  • 생성자 (Constructor)를 통해 생성: list() 또는 list(iterable)


이 중 생성자를 통한 list 생성은 초보자에겐 그닥 추천하고 싶지 않은데, iterable 에 대한 개념이 제대로 잡히지 않은 상태에서 list('abc') [각주:2]와 같이 꺿쇠괄호와 비슷한 문법으로 list를 생성해서 기대와는 전혀다른 결과가 나온다거나 할 수 있으므로 주의하자.


아마 파이썬을 사용하다보면 가장 많이 사용할 기능이 아닐까 싶다. 가장 논리적이고 인풋값을 그나마 가장 그대로 저장하기 때문이라고 생각된다. set은 중복값을 날려버리고, dict는 항상 keyvalue가 있는 상황은 아니고, tupleimmutable로써 list와는 지향하는 바가 다르고[각주:3]


Warnings


list를 만들었다면 이제 다양한 방법으로 사용하면 된다. 아래는 list의 모든 메소드에 대한 설명과 예시이다. 하지만 그 전에, 몇가지 주의사항을 숙지하고 가자. 물론 한시가 급하다면 생략해도 좋다. 책임은 못진다

  1. 대다수의 list 메소드들은 리턴값이 None이다. 다른말로하면 새로운 list가 생성되지 않고, 해당 list 오브젝트가 변하게 되는데 이렇게 in-place로 변할 수 있는 것들을 mutable 이라고 생각하면 된다.

    old_list = [1,2,3]
    new_list = old_list.append(4)
    

    위와 같이, old_listappend를 한 값을 new_list로 받고, new_list가 아무것도 안나온다고 하는 경우가 종종 있는데, old_list.appendNone를 리턴 함으로 new_list = None이 된 것. 꼭 주의하자!

  1. list 뿐만 아니라, 파이썬에서 전반적으로 혼용되는 문법인데, 이미 생성된 list를 다시 다른 변수로 선언하면, 새로운 list가 생기는게 아니라, 똑같은 오브젝트를 다른이름으로 바라보게 된다. 말이 아리까리한데 예시와 함께 알아보자

    my_list1 = [1,2,3]
    my_list2 = my_list1
    my_list2
    # [1,2,3]
    

    이 경우 my_list1my_list2라는 2개의 리스트가 생겼다고 착각할 수 있는데, 실제로는 my_list1이나 my_list2나 모두 같은 오브젝트를 바라보고 있으므로, 아래와 같이 둘 중 하나를 바꾸면 둘 모두 바뀌게 된다!

    my_list1[0] = 10
    my_list1
    # [10,2,3]
    my_list2
    # [10,2,3]
    

    my_list1만 수정을 했는데 my_list2도 같이 바뀌는 경우를 볼 수 있다. 변수를 변수로 선언하는게 좋은 습관이 아니라는 좋은 예시다. 만약 그럼에도 불가피하게 변수를 사용해야 한다면, list.copy를 애용하자.

    my_list1 = [1,2,3]
    my_list2 = my_list1.copy() # 이 시점에서 my_list2라는 새로운 오브젝트가 생성된다.
    my_list1[0] = 10
    my_list1
    # [10,2,3]
    my_list2
    # [1,2,3]
    

     

이상 list를 사용하면서 주의해야 할 점을 알아봤는데, 사실 이건 list만의 주의사항이 아닌, 전반적으로 파이썬 사용시에 주의사항이라고 할 수 있다. 그러니 첫째도 조심, 둘째도 조심하자.

  1. 리스트 축약, 리스트 포괄식 등 다양한 한글 표기법이 있으나, 당장 StackOverflow에 검색할 수 없는 노릇이기도 하고, 공식 문서도 리스트 컴프리헨션이라고 하니 영어로 쓰는 습관을 들이자 [본문으로]
  2. ['abc'] 가 아니라 ['a','b','c']가 된다. str 은 iterable이기 때문. [본문으로]
  3. tuple vs list는 파이썬 개발자라면 한번쯤은 고민해봐야 할 문제다. 수많은 좋은 글들이 있으니 참고하자 [본문으로]