본문 바로가기

Univ/Python Programming

Python `::` 슬라이싱 문법

::는 슬라이싱(slicing) 문법 안에서 쓰는 표기다.
전체 형태는 다음과 같다.

문자열[시작:끝:간격]
리스트[시작:끝:간격]

즉, :가 세 칸을 나누고 있고, 그중에서 값을 생략할 수 있다.


예를 들어:

s = "abcdef"
print(s[1:5:2])

결과:

bd

의미는 다음과 같다.

  • 시작: 1번 인덱스부터
  • 끝: 5번 인덱스 전까지
  • 간격: 2칸씩

그래서 b, d가 선택된다.


::가 뜻하는 것

::는 시작과 끝을 생략하고, 간격만 쓰는 형태다.

s[::2]

이 뜻은:

  • 시작: 처음부터
  • 끝: 끝까지
  • 간격: 2

즉, 처음부터 끝까지 2칸씩 가져오라는 뜻이다.

예:

s = "abcdef"
print(s[::2])

결과:

ace

[::-1]가 중요한 이유

s[::-1]

이 뜻은:

  • 시작: 끝에서부터 자동 처리
  • 끝: 처음까지 자동 처리
  • 간격: -1

간격이 -1이면 거꾸로 한 칸씩 이동하므로 문자열이 뒤집힌다.

예:

s = "abcde"
print(s[::-1])

결과:

edcba

자주 쓰는 형태

s[:]      # 전체 복사
s[::1]    # 처음부터 끝까지 1칸씩
s[::2]    # 처음부터 끝까지 2칸씩
s[::-1]   # 뒤집기

인덱스까지 같이 보면

문자열 "abcde"의 인덱스는 다음과 같다.

 a  b  c  d  e
 0  1  2  3  4
-5 -4 -3 -2 -1

그래서

s[::-1]

는 사실상

  • e
  • d
  • c
  • b
  • a

순서로 읽는 것과 같다.


왜 :가 두 개냐

슬라이싱 문법이 원래 3칸 구조이기 때문이다.

[시작:끝:간격]

예를 들어 간격만 쓰고 싶으면 앞의 두 칸을 비워야 하므로 ::가 된다.

[ : : -1 ]

이걸 붙여 쓰면:

[::-1]

헷갈리는 예시

s = "abcdef"
print(s[:3])     # abc
print(s[3:])     # def
print(s[::2])    # ace
print(s[::-1])   # fedcba
print(s[1:5:2])  # bd

한 줄로 정리하면,
::는 슬라이싱에서 시작과 끝을 비워 두고 간격만 지정하는 표기다.