[python] 파이썬 목록 조각에서 할당은 어떻게 작동합니까?

Python 문서에 따르면 목록을 분할하면 새 목록이 반환됩니다.
이제 “새”목록이 반환되면 “슬라이스에 할당”과 관련된 다음과 같은 의심이 있습니다.

a = [1, 2, 3]
a[0:2] = [4, 5]
print a

이제 출력은 다음과 같습니다.

[4, 5, 3] 
  1. 무언가를 반환하는 것이 어떻게 표현의 왼쪽에 올 수 있습니까?
  2. 예, 문서를 읽었는데 목록을 분할하면 “새”목록이 반환되기 때문에 가능하다고합니다. 원래 목록이 수정되는 이유는 무엇입니까? 나는 그 뒤에있는 메커니즘을 이해할 수 없습니다.


답변

매우 유사한 구문을 사용하는 두 가지 별개의 작업을 혼동하고 있습니다.

1) 슬라이스 :

b = a[0:2]

이렇게하면의 슬라이스 사본이 만들어져에 a할당됩니다 b.

2) 슬라이스 할당 :

a[0:2] = b

이렇게 하면의 조각이 의 내용으로 바뀝니다 .ab

구문은 비슷하지만 (설계 상 상상합니다!) 두 가지 다른 작업입니다.


답변

연산자 a의 왼쪽에 지정 하면 현재 컨텍스트 의 이름 이 새 값을 가리 키도록 변경하는 =Python의 일반 할당 을 사용하는 것 a입니다. a가리키는 이전 값은 변경되지 않습니다 .

연산자 a[0:2]의 왼쪽에 지정 =하면 Python에 Slice Assignment 를 사용하고 싶다고 말하는 것 입니다. 슬라이스 할당은 목록에 대한 특수 구문으로, 목록에서 내용을 삽입, 삭제 또는 바꿀 수 있습니다.

삽입 :

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

삭제 :

>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]

교체 :

>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]

노트 :

슬라이스의 길이는 할당 된 시퀀스의 길이와 다를 수 있으므로 타겟 시퀀스가 ​​허용하는 경우 타겟 시퀀스의 길이를 변경합니다. – 소스

Slice Assignment는 Tuple Unpacking 과 유사한 기능을 제공합니다 . 예를 들어 a[0:1] = [4, 5]는 다음과 같습니다.

# Tuple Unpacking
a[0], a[1] = [4, 5]

Tuple Unpacking을 사용하면 비 순차 목록을 수정할 수 있습니다.

>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]

그러나 튜플 압축 해제는 요소를 삽입하거나 제거 할 수 없으므로 교체로 제한됩니다.

이 모든 작업 전후 a는 동일한 정확한 목록입니다. 파이썬은 단순히 목록을 제자리에서 수정하기 위해 멋진 구문 설탕을 제공합니다.


답변

나는 전에 같은 질문을 보았고 언어 사양과 관련이 있습니다. 할당 문 에 따르면 ,

  1. 할당의 왼쪽이 구독이면 Python은 __setitem__해당 개체를 호출 합니다. a[i] = x와 동일합니다 a.__setitem__(i, x).

  2. 할당의 왼쪽 슬라이스 인 경우, 파이썬은 또한 호출 __setitem__하지만, 다른 인수 :
    a[1:4]=[1,2,3]동일합니다
    a.__setitem__(slice(1,4,None), [1,2,3])

그렇기 때문에 ‘=’의 왼쪽에있는 목록 조각이 다르게 동작합니다.


답변

할당 작업의 왼쪽을 슬라이스하여 할당 할 항목을 지정합니다.


답변