>백엔드 개발 >파이썬 튜토리얼 >Python은 임시 변수를 사용하지 않고 어떻게 튜플 값을 교환합니까?

Python은 임시 변수를 사용하지 않고 어떻게 튜플 값을 교환합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-28 09:07:10262검색

How does Python swap tuple values without using a temporary variable?

튜플에서 값 교환: 내부 엿보기

Python에서는 (a, b) = (b, a)와 같은 튜플 할당을 사용하여 두 변수의 값을 교환합니다. 간단한 트릭처럼 보일 수도 있지만 임시 변수 없이 내부적으로 어떻게 작동합니까?

Stack 조작

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.