>  기사  >  백엔드 개발  >  Python의 시퀀스 증분 할당에 대한 간략한 소개(예제 포함)

Python의 시퀀스 증분 할당에 대한 간략한 소개(예제 포함)

不言
不言앞으로
2018-10-08 16:29:243042검색

이 기사는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제