• 슬라이싱 구문의 기본 형태: 리스트[시작:끝]

    • 시작 인덱스의 원소는 슬라이스에 포함되지만 끝 인덱스의 원소는 포함 X

      a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
      print('가운데 두개:  ', a[3:5])
      print('마지막을 제외한 나버지:', a[1:7])
      
  • 리스트의 맨앞/끝까지 슬라이싱할 때 쓸데없이 끝 인덱스를 적지 말라 (ㄷ ㄷ)

    assert a[:5] == a[0:5]
    assert a[5:] == a[5:len(a)]
    
  • 슬라이싱할 때 리스트의 인덱스 범위에 넘어가는 시작과 끝 인덱스는 무시됨

  • 그러나, 인덱스 범위 넘어서 원소에 접근할려고 하면 에러남

    first_twenty_items = a[:20]
    last_twenty_items = a[-20:]
    
    a[20]
    >> IndexError: list index out of range
    
  • 리스트를 슬라이싱한 결과는 완전히 새로운 리스트

    • 기존 리스트는 참조값이 그대로 유지됨
    • 따라서, 슬라이싱한 결과로 얻은 리스트를 변경해도 원래 리스트는 변경 X
    b = a[3:]
    print('Before:   ', b)
    b[1] = 99
    print('After:    ', b)
    print('No change:', a)
    
  • 슬라이싱에서 시작과 끝 인덱스를 모두 생략하면 원래 리스트를 복사한 새 리스트를 얻음

  • 반면, 슬라이싱하지 않은 체로 대입하면 리스트 복사본으로 덮어씀

    b = a[:]
    assert b == a and b is not a
    
    # 같은 리스트 객체이므로 a 원소를 수정하면 b도 바뀜
    b = a
    print('Before a', a)
    print('Before b', b)
    a[:] = [101, 102, 103]
    assert a is b             # Still the same list object
    print('After a ', a)      # Now has different contents
    print('After b ', b)      # Same list, so same contents as a
    
  • 대입시 슬라이드를 사용하면 원본 리스트에서 지정한 범위에 들어 있는 원소를 변경함

    • 언패킹 대입(ex. a, b = c[:2])과 달리 슬라이스 대입은 슬라이스와 대입되는 리스트의 길이가 같을 필요 X
      • 리스트에 지정한 슬라이스 길이보다 대입되는 배열 길이가 짧아서 리스트가 줄어드는 경우

        print('Before ', a)
        a[2:7] = [99, 22, 14]
        print('After  ', a)
        
      • 대입되는 길이가 길어서 리스트가 늘어나는 경우

        print('Before ', a)
        a[2:3] = [47, 11]
        print('After  ', a)