"증강 된"할당 연산자 +=
는 2000 년 10 월에 릴리스 된 Python 2.0에 도입되었습니다. 설계 및 근거는 PEP 203에 설명되어 있습니다. 이 운영자의 선언 된 목표 중 하나는 전체 작업 지원입니다. 쓰기
a = [1, 2, 3]
a += [4, 5, 6]
목록 업데이트 할 예정이다 a
장소를 . 이것은리스트에 대한 다른 참조 a
, 예를 들어 a
함수 인수로 수신 된 시기 가 중요합니다 .
그러나 정수 및 문자열을 포함한 많은 Python 유형은 변경할 수 없으므로 i += 1
정수 i
가 제대로 작동하지 않을 수 있으므로 작업이 항상 제대로 수행되지 는 않습니다.
요약하면, 확장 된 할당 연산자는 가능하면 제대로 작동하고 그렇지 않으면 새 객체를 생성해야했습니다. 이러한 설계 목표를 용이하게하기 x += y
위해 다음과 같이 동작하도록 표현 을 지정했습니다.
- 경우
x.__iadd__
정의, x.__iadd__(y)
평가됩니다.
- 그렇지 않으면
x.__add__
is가 구현 된 x.__add__(y)
것으로 평가됩니다.
- 그렇지 않으면
y.__radd__
is가 구현 된 y.__radd__(x)
것으로 평가됩니다.
- 그렇지 않으면 오류가 발생합니다.
이 프로세스에서 얻은 첫 번째 결과 x
는 ( NotImplemented
단일 결과가 아닌 경우 다음 단계로 조회가 계속되는 경우) 에 다시 할당됩니다 .
이 프로세스를 통해 전체 수정을 지원하는 유형이 구현 될 수 __iadd__()
있습니다. 내부 수정을 지원 하지 않는 타입은 파이썬이 자동으로 대체되기 때문에 새로운 매직 메소드를 추가 할 필요가 없습니다 x = x + y
.
마지막으로 실제 할당 된 질문에 대해 살펴 보겠습니다. 왜 할당 할당 연산자를 사용하여 튜플을 목록에 추가 할 수 있습니까? 메모리에서, 이것의 역사는 대략 다음과 같았습니다 :이 list.__iadd__()
메소드는 list.extend()
파이썬 2.0에서 이미 존재하는 메소드 를 단순히 호출하기 위해 구현되었습니다 . 반복자가 Python 2.1에 도입되었을 때 list.extend()
임의의 반복자를 허용 하도록 메소드가 업데이트되었습니다. 이러한 변경의 최종 결과는 my_list += my_tuple
Python 2.1부터 작동했습니다. list.__add__()
방법은, 그러나, 오른쪽 인수로 임의의 반복자를 지원하기로되지 않았다 - 이것은 강력하게 형식화 된 언어에 대한 부적절한 것으로 간주되었다.
필자는 개인적으로 증강 연산자의 구현이 파이썬에서 너무 복잡하다고 생각합니다. 다음과 같은 놀라운 부작용이 있습니다.
t = ([42], [43])
t[0] += [44]
두 번째 줄은 상승 TypeError: 'tuple' object does not support item assignment
, 그러나 작업이 성공적으로 어쨌든 수행 - t
될 것입니다 ([42, 44], [43])
오류를 제기 라인을 실행 한 후.