2017-12-25 12 views
0

:확장 된 슬라이스 할당이 일반 슬라이스 할당보다 유연성이 떨어지는 이유는 무엇입니까? <a href="https://docs.python.org/3/whatsnew/2.3.html#extended-slices" rel="nofollow noreferrer">extended slices</a>에 파이썬 문서에 따르면

당신은 목록 또는 에 할당하거나 확장 슬라이스를 삭제할 수 있습니다 배열로 변경 가능한 순서를 가지고 있지만 약간의 차이 할당 사이의 확장에가있는 경우 및 정기적 인 조각. 일정한 슬라이스 할당 시퀀스의 길이를 변경하는데 사용될 수있다 :

>>> a = range(3) 
>>> a 
[0, 1, 2] 
>>> a[1:3] = [4, 5, 6] 
>>> a 
[0, 4, 5, 6] 

확장 조각이가요 아니다. 확장 슬라이스에 할당 할 때, 문장의 오른쪽에있는 목록은 대체 에게 슬라이스로 동일한 수의 항목이 포함되어야합니다

>>> a = range(4) 
>>> a 
[0, 1, 2, 3] 
>>> a[::2] 
[0, 2] 
>>> a[::2] = [0, -1] 
>>> a 
[0, 1, -1, 3] 
>>> a[::2] = [0,1,2] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
ValueError: attempt to assign sequence of size 3 to extended slice of size 2 

는 이해가 안 돼요 왜 "일반을 "슬라이스 메서드는 작동하지만"확장 된 "슬라이스 메서드는 작동하지 않습니다. "확장 된"슬라이스와 "일반"슬라이스를 구별하는 것은 무엇이며 왜 "확장 된"슬라이스 방법은 실패합니까?

+1

무엇이 다른지는 첫 번째 단락에서 설명한대로 세 번째 매개 변수 인 단계입니다. 이는 명령문의 오른쪽에있는 목록에 복사하려는 텍스트의 내용을 나타내는 대체 할 슬라이스 (2)와 동일한 수의 항목 (3)이 없기 때문에 실패합니다. 그렇기 때문에 그것들을 그 묘사의 삽화로 사용하는 이유입니다. 당신이 * "왜"* 무슨 뜻인지는 분명하지 않습니다. – jonrsharpe

답변

1

그것은 당신이

a[::3] = [0, 1, 2] 

는 4 항목 목록 작업을 얼마나 상상하려고하면 문제를보고 조금 쉽게 :

+---+---+---+---+ + +---+ 
| a | b | c | d |  | ? | 
+---+---+---+---+ + +---+ 
^  ^  ^
+---+  +---+  +---+ 
| 0 |  | 1 |  | 2 | 
+---+  +---+  +---+ 

우리는 모든 제 값을 대체하기 위해 노력하고 , 그러나 우리 목록은 충분히 길지 않다. 그래서 만일 우리가 어쨌든 나아 간다면 우리는 어떤 종류의 아이템이 실제로 존재하지 않는 어떤 종류의 이상한 프랑 켄슈 타인리스트로 끝날 것이다. 그런 다음 누군가가 a[5]에 액세스하려고 시도하고 IndexError (정상적으로 작동한다고해도 a[6]이 있더라도) 은 실제로이됩니다.

을 하나씩 확장하여 기술적으로도 a[::2] 사례를 없애 버릴 수도 있지만, 일관성을 위해 Python에서는 가치가있는 곳이없는 한 모든 확장 된 분할 할당을 금지합니다.

일반 슬라이스는 항상 1의 보폭을 가지므로 갭이 발생할 가능성이 없으므로 할당을 안전하게 허용 할 수 있습니다.

관련 문제