[python] 인덱스가 범위를 벗어난 부분 문자열 슬라이싱이 작동하는 이유는 무엇입니까?

'example'[999:9999]오류가 발생 하지 않습니까? 이후 'example'[9]않는, 그 뒤에 동기는 무엇인가?

이 동작 에서 두 가지 모두 동일한 문자열을 생성하더라도 'example'[3]본질적으로 / 내부적으로.와 동일하지 않다고 가정 할 수 있습니다 .'example'[3:4]'m'



답변

맞아요! 'example'[3:4]'example'[3]시퀀스의 경계 외부 근본적으로 다른, 그리고 슬라이스 있습니다 (내장 기능에 대한 최소한) 오류가 발생하지 않습니다.

처음에는 놀라 울 수도 있지만 생각해 보면 말이됩니다. 인덱싱은 단일 항목을 반환하지만 슬라이싱은 항목의 하위 시퀀스를 반환합니다. 따라서 존재하지 않는 값을 인덱싱하려고하면 반환 할 항목이 없습니다. 그러나 경계를 벗어난 시퀀스를 슬라이스하면 여전히 빈 시퀀스를 반환 할 수 있습니다.

여기서 혼란스러운 부분은 문자열이 목록과 약간 다르게 동작한다는 것입니다. 목록에 동일한 작업을 수행하면 어떻게되는지보세요.

>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]

여기서 차이점은 분명합니다. 문자열의 경우 결과는 동일한 것으로 보입니다. 파이썬에서는 문자열 외부에 개별 문자가 없기 때문입니다. 단일 문자는 1 자 문자열입니다.

(시퀀스 범위 밖에서 슬라이스하는 정확한 의미는 mgilson의 답변을 참조하십시오 .)


답변

문서 의 강력한 섹션을 가리키는 답변을 추가하기 위해 :

같은 슬라이스 표현을 감안할 때 s[i:j:k],

k 단계 에서 i 에서 j 까지 의 s 조각 은 다음과 같은 인덱스가있는 항목의 시퀀스로 정의됩니다 . 즉, 인덱스는 , , , 때 등, 정지 j는 도달 할 때 (그러나 결코 포함되지 J ). 경우 K는 양수, IJ는 감소된다 가 크면x = i + n*k0 <= n < (j-i)/kii+ki+2*ki+3*klen(s)

당신이 쓰는 경우 s[999:9999], 파이썬은 반환 s[len(s):len(s)]이후 len(s) < 999와 단계는 긍정적 ( 1– 기본값).


답변

슬라이싱은 기본 제공 유형에 의해 경계가 확인되지 않습니다. 두 예제 모두 동일한 결과를 나타내는 것처럼 보이지만 작동 방식은 다릅니다. 대신 목록으로 시도하십시오.


답변