development

파이썬이 시퀀스에 대해 범위를 벗어난 슬라이스 인덱스를 허용하는 이유는 무엇입니까?

big-blog 2020. 10. 27. 22:46
반응형

파이썬이 시퀀스에 대해 범위를 벗어난 슬라이스 인덱스를 허용하는 이유는 무엇입니까?


그래서 나는 이상한 파이썬 기능처럼 보이는 것을 발견했고 그것에 대한 설명을 원했습니다.

다음 배열 조작은 다소 의미가 있습니다.

p = [1,2,3]
p[3:] = [4] 
p = [1,2,3,4]

실제로이 값을 끝에 추가한다고 생각합니다. 맞습니까?
그러나 왜 이것을 할 수 있습니까?

p[20:22] = [5,6]
p = [1,2,3,4,5,6]

그리고 훨씬 더 :

p[20:100] = [7,8]
p = [1,2,3,4,5,6,7,8]

이것은 잘못된 논리처럼 보입니다. 이것은 오류를 던질 것 같습니다!

설명이 있습니까?
-파이썬이하는 일은 그저 이상한 일입니까?
-목적이 있는가?
-아니면 잘못된 생각인가요?


범위를 벗어난 지수에 관한 질문의 일부

슬라이스 로직은 인덱스를 시퀀스 길이에 자동으로 클립합니다.

편의를 위해 슬라이스 인덱스가 끝점을지나 확장되도록 허용했습니다. 모든 표현식의 범위를 확인한 다음 수동으로 제한을 조정해야하므로 Python이 자동으로 수행합니다.

문자 메시지의 처음 50 자 이하를 표시하려는 사용 사례를 고려하십시오.

쉬운 방법 (Python이 지금하는 일) :

preview = msg[:50]

또는 어려운 방법 (한도를 직접 확인) :

n = len(msg)
preview = msg[:50] if n > 50 else msg

끝점 조정을 위해 해당 논리를 수동으로 구현하는 것은 잊기 쉽고 잘못되기 쉬우 며 (두 곳에서 50을 업데이트 함) 장황하고 느릴 것입니다. 파이썬은 그 논리를 간결하고 자동적이며 빠르고 정확한 내부로 이동합니다. 이것이 제가 파이썬을 사랑하는 이유 중 하나입니다 :-)

입력 길이와 할당 길이 불일치에 관한 질문의 일부

OP는 또한 p[20:100] = [7,8]할당 대상이 대체 데이터 길이 (2)와 다른 길이 (80)를 갖는 경우 와 같이 할당을 허용하는 이유를 알고 싶었습니다 .

문자열과의 비유를 통해 동기를 확인하는 것이 가장 쉽습니다. 을 고려하십시오 "five little monkeys".replace("little", "humongous"). 대상 "little"에는 6 개의 문자 만 있고 "humongous"에는 9 개의 문자가 있습니다. 목록으로도 똑같이 할 수 있습니다.

>>> s = list("five little monkeys")
>>> i = s.index('l')
>>> n = len('little')
>>> s[i : i+n ] = list("humongous")
>>> ''.join(s)
'five humongous monkeys'

이 모든 것은 편리함으로 귀결됩니다.

copy ()clear () 메서드 가 도입되기 전에는 다음과 같은 인기 관용구가 사용되었습니다.

s[:] = []           # clear a list
t = u[:]            # copy a list

지금도 필터링 할 때이를 사용하여 목록을 업데이트합니다.

s[:] = [x for x in s if not math.isnan(x)]   # filter-out NaN values

이 실용적인 예가 슬라이싱이 작동하는 이유에 대한 좋은 관점을 제공하기를 바랍니다.


문서는 답이 있습니다 :

s[i:j]: ~ s까지의 슬라이스 (주 (4))ij

(4) sfrom ito 의 슬라이스 j는 다음과 k같은 인덱스가있는 항목의 시퀀스로 정의됩니다 i <= k < j. 경우 i또는 것은 j보다 큰 경우 len(s), 사용len(s) . 경우는 i생략되거나 None, 사용 0. 경우는 j생략되거나 None, 사용 len(s). 경우 i보다 크거나 같다 j, 슬라이스가 비어 있습니다.

문서는IndexError 이 동작 확인합니다.

예외 IndexError

시퀀스 첨자가 범위를 벗어 났을 때 발생합니다. ( 슬라이스 인덱스는 허용 된 범위에 속하도록 자동으로 잘립니다. 인덱스가 정수가 아니면 TypeError발생합니다.)

Essentially, stuff like p[20:100] is being reduced to p[len(p):len(p]. p[len(p):len(p] is an empty slice at the end of the list, and assigning a list to it will modify the end of the list to contain said list. Thus, it works like appending/extending the original list.

This behavior is the same as what happens when you assign a list to an empty slice anywhere in the original list. For example:

In [1]: p = [1, 2, 3, 4]

In [2]: p[2:2] = [42, 42, 42]

In [3]: p
Out[3]: [1, 2, 42, 42, 42, 3, 4]

참고URL : https://stackoverflow.com/questions/54613753/why-does-python-allow-out-of-range-slice-indexes-for-sequences

반응형