Python에서는 (a, b) = (b, a)와 같은 튜플 할당을 사용하여 두 변수의 값을 교환합니다. 간단한 트릭처럼 보일 수도 있지만 임시 변수 없이 내부적으로 어떻게 작동합니까?
Python은 왼쪽과 별도로 과제의 오른쪽 표현식을 평가합니다. 우변이 계산되면 그 결과가 스택에 저장됩니다. 그런 다음 스택에서 직접 작동하는 opcode를 사용하여 왼쪽 이름이 할당됩니다.
두 개 또는 세 개의 항목이 있는 튜플 할당의 경우 Python은 요소를 교환하기 위해 ROT_TWO 또는 ROT_THREE opcode를 사용하여 스택을 직접 활용합니다. 예를 들어:
def foo(a, b): a, b = b, a
dis.dis(foo)를 사용하여 이 함수를 분해하면 다음이 드러납니다.
2 0 LOAD_FAST 1 (b) 3 LOAD_FAST 0 (a) 6 ROT_TWO 7 STORE_FAST 0 (a) 10 STORE_FAST 1 (b) 13 LOAD_CONST 0 (None) 16 RETURN_VALUE
여기서 ROT_TWO는 스택의 상위 두 값을 교환하여 효과적으로 역전시킵니다. a와 b의 순서.
3개 이상의 요소가 포함된 할당의 경우 Python은 스택에 중간 튜플을 구성합니다. 다음 예를 고려해보세요.
def bar(a, b, c, d): d, c, b, a = a, b, c, d
디스어셈블리는 다음을 보여줍니다.
2 0 LOAD_FAST 0 (a) 3 LOAD_FAST 1 (b) 6 LOAD_FAST 2 (c) 9 LOAD_FAST 3 (d) 12 BUILD_TUPLE 4 15 UNPACK_SEQUENCE 4 18 STORE_FAST 3 (d) 21 STORE_FAST 2 (c) 24 STORE_FAST 1 (b) 27 STORE_FAST 0 (a) 30 LOAD_CONST 0 (None) 33 RETURN_VALUE
BUILD_TUPLE은 스택의 값에서 역순으로 튜플을 빌드합니다. 그런 다음 UNPACK_SEQUENCE는 튜플을 팝하고 해당 요소를 왼쪽 변수에 할당하기 위해 다시 스택에 배치합니다.
UNPACK_SEQUENCE는 2개 또는 3개 항목 할당에 대해 중복되는 것처럼 보이지만 이후 최적화 단계에서는 BUILD_TUPLE/UNPACK_SEQUENCE 콤보를 더 효율적인 것으로 대체합니다. ROT_TWO 또는 ROT_THREE opcode를 사용하여 스와핑 메커니즘을 최대한 간소화합니다.
위 내용은 Python은 임시 변수를 사용하지 않고 어떻게 튜플 값을 교환합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!