할당은 목록 슬라이스에서 어떻게 작동합니까?
Python docs에 따르면 목록을 슬라이스하면 새 목록이 반환됩니다.
"새" 목록이 반환되는 경우 "슬라이스에 할당"과 관련된 다음 질문이 있습니다.
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
출력은 다음과 같습니다.
[4, 5, 3]
- 무엇인가를 돌려주는 것이 어떻게 표현의 왼쪽에 나타날 수 있는가?
- 네, 문서를 읽었는데 가능하다고 되어 있는데, 목록을 잘라내면 "새로운" 목록이 반환되는데, 왜 원래 목록이 수정되는 건가요?나는 그것의 배후에 있는 기계들을 이해할 수 없다.
매우 유사한 구문을 사용하는 다음 두 가지 작업을 혼동하고 있습니다.
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은 단순히 목록을 수정하기 위한 훌륭한 구문설탕을 제공합니다.
예전에 같은 질문을 받았는데, 언어 사양에 관한 질문입니다.임무 명세서에 따르면
할당 좌측이 서브스크립션인 경우 Python은 해당 객체를 호출합니다.
a[i] = x
a.__setitem__(i, x)
.은 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
'programing' 카테고리의 다른 글
Reactive Cocoa vs RxSwift - 장단점 (0) | 2023.04.11 |
---|---|
SQL Server Management Studio에서 워드랩하는 방법 (0) | 2023.04.11 |
Xcode 6: 키보드가 시뮬레이터에 표시되지 않음 (0) | 2023.04.11 |
Excel 2013에서 .csv 파일을 올바르게 표시하는 방법 (0) | 2023.04.11 |
이 앱은 IDFA(Advertising Identifier)를 사용하고 있습니까?- AdMob 6.8.0 (0) | 2023.04.11 |