programing

할당은 목록 슬라이스에서 어떻게 작동합니까?

batch 2023. 4. 11. 21:50
반응형

할당은 목록 슬라이스에서 어떻게 작동합니까?

Python docs에 따르면 목록을 슬라이스하면 새 목록이 반환됩니다.
"새" 목록이 반환되는 경우 "슬라이스에 할당"과 관련된 다음 질문이 있습니다.

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

슬라이스를 바꿉니다.a의 내용과 함께b.

구문은 비슷하지만(내 생각에는!), 두 가지 조작이 다릅니다.

지정한 경우a의 왼쪽에=오퍼레이터, Python의 일반 할당을 사용하고 있습니다.이것에 의해, 이름이 바뀝니다.a현재 컨텍스트에서 새 값을 가리킵니다.이렇게 해도 이전 값은 변경되지 않습니다.a가리키고 있었다.

지정함으로써a[0:2]의 왼쪽에=오퍼레이터, 슬라이스 할당을 사용하고 싶다고 Python에게 말합니다.슬라이스 할당은 목록의 내용을 삽입, 삭제 또는 바꿀 수 있는 특수한 구문입니다.

삽입:

>>> 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]

주의:

슬라이스의 길이는 할당된 시퀀스의 길이와 다를 수 있으며, 따라서 대상 시퀀스가 허용하는 경우 대상 시퀀스의 길이가 변경됩니다.

슬라이스 할당은 태플 언팩과 유사한 기능을 제공합니다.예를들면,a[0:1] = [4, 5]는 다음과 같습니다.

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

태플 언팩을 사용하면 비순차 목록을 변경할 수 있습니다.

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

단, 요소를 삽입하거나 제거할 수 없기 때문에 태플 개봉은 교환으로 제한됩니다.

이 모든 수술 전후에a같은 리스트입니다.Python은 단순히 목록을 수정하기 위한 훌륭한 구문설탕을 제공합니다.

예전에 같은 질문을 받았는데, 언어 사양에 관한 질문입니다.임무 명세서에 따르면

  1. 할당 좌측이 서브스크립션인 경우 Python은 해당 객체를 호출합니다. a[i] = x a.__setitem__(i, x).

  2. 은 Python도 합니다.__setitem__ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,a[1:4]=[1,2,3] a.__setitem__(slice(1,4,None), [1,2,3])

그렇기 때문에 '=' 왼쪽에 있는 목록 조각의 동작이 다릅니다.

할당 작업의 왼쪽에 슬라이스를 함으로써 할당할 항목을 지정할 수 있습니다.

a[0:2] = [4,5]= (슬라이스)a[0:2]) 의 값=,[4,5].

언급URL : https://stackoverflow.com/questions/10623302/how-does-assignment-work-with-list-slices

반응형