이 기사는 Python의 시퀀스 증분 할당에 대한 간략한 소개를 제공합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
증분 할당 연산자는 +=이고 *=. += 뒤에 있는 특수 메서드는 __iadd__입니다. 클래스가 __iadd__ 메서드를 구현하지 않으면 Python은 한 걸음 물러나서 이를 호출합니다. __add__ 메소드. 이 두 메서드의 차이점은 __iadd__는 내부 변경이고 원래 값의 메모리 주소를 변경하지 않는 반면 __add__ 메서드는 새 개체를 가져옵니다.
다음 표현식을 고려하세요.
a += b
a가 __iadd__ 메서드를 구현하면 a가 그 자리에서 변경됩니다(메모리 주소는 변경되지 않은 상태로 유지됩니다). a가 __iadd__ 메서드를 구현하지 않으면 a += b 표현식의 효과는 a = a + b와 동일해지며 새 객체를 생성하고 이를 a에 할당합니다.
일반적으로 변경 가능한 시퀀스는 일반적으로 __iadd__ 메서드를 구현하므로 +=는 내부 추가인 반면 불변 시퀀스는 이 작업을 전혀 지원하지 않습니다.
*= 은 += 와 동일하지만 그 뒤에 있는 특별한 메소드가 __imul__이라는 점만 다릅니다.
a = [1, 2, 3] b = [4, 5, 6]print("id(a) = %d" % id(a)) a += bprint("id(a) = %d" % id(a)) c = [1, 2, 3]print("id(c) = %d" % id(c)) c = c + bprint("id(c) = %d" % id(c)) d = (1, 2, 3)print("id(d) = %d" % id(d)) d *= 2print("id(d) = %d" % id(d))
실행 결과는 다음과 같습니다.
id(a) = 1298277978824 id(a) = 1298277978824 id(c) = 1298277978696 id(c) = 1298277978632 id(d) = 1298277972872 id(d) = 1298277136616
시퀀스의 증분 할당을 이해하려면 2013년 Python Brazil Conference에서 Leonardo Rochael이 언급한 퍼즐을 살펴보겠습니다.
t = (1, 2, [30, 40]) t[2] += [50, 60]
A. t는 (1, 2, [30, 40, 50, 60])
B입니다. 튜플은 해당 요소에 대한 할당을 지원하지 않으므로 TypeError 예외가 발생합니다.
C.
D. A, B 둘 다 맞습니다
저처럼 B를 선택하는 분들이 많을 것 같은데, 사실 정답은 D입니다. 콘솔에서 코드를 실행하면 결과는 다음과 같습니다.
요약:
1. 매번 새 시퀀스를 생성해야 하기 때문에 불변 시퀀스에 대한 반복적인 접합 작업은 매우 비효율적입니다. 원래 시퀀스를 생성해야 합니다. 시퀀스의 요소는 새 시퀀스에 복사된 다음 새 요소가 추가됩니다.
2. 변경 가능한 객체를 튜플에 넣지 마세요.
3. 증분 할당은 원자적 연산이 아닙니다. 예외가 발생하더라도 t 값은 여전히 변경됩니다.
위 내용은 Python의 시퀀스 증분 할당에 대한 간략한 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!