>백엔드 개발 >파이썬 튜토리얼 >Python의 \'is\' 연산자가 다른 코드 블록에서 큰 정수와 다르게 동작하는 이유는 무엇입니까?

Python의 \'is\' 연산자가 다른 코드 블록에서 큰 정수와 다르게 동작하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-01 15:26:31412검색

Why Does Python's

큰 정수를 사용한 Python의 "is" 연산자 동작

문제

Python에서 is 연산자는 동등성보다는 객체 ID를 확인합니다. 그러나 특정 시나리오에서는 아래에 설명된 것처럼 이 동작이 예상치 못한 것일 수 있습니다.

<code class="python">def func():
    a = 1000
    b = 1000
    return a is b

a = 1000
b = 1000

print(a is b, func())  # (False, True)</code>

is 비교는 함수 내에서는 True를 반환하지만 함수 외부에서는 False를 반환합니다. 다른 평가 결과에도 불구하고 정수 a와 b는 동일한 값을 갖는 것처럼 보입니다.

설명

이 동작을 이해하려면 Python 인터프리터의 코드 블록 해석이 중요합니다. Python 참조 매뉴얼에 따르면 대화형으로 실행되는 각 명령은 별도의 코드 블록을 구성합니다. 다음은 블록으로 간주됩니다:

  • 모듈
  • 함수 본문
  • 클래스 정의

단일 코드 블록 내에서 Python은 특정 항목을 캐시합니다. 작은 정수([-5, 256] 범위 내)와 같은 객체. 여러 변수가 동일한 정수 리터럴을 참조하는 경우 모두 동일한 캐시된 정수 개체를 참조합니다. 그러나 리터럴이 다른 코드 블록에서 선언되면 고유한 정수 개체가 생성됩니다.

다른 코드 개체, 다른 ID

이를 설명하려면 각 사례에 대한 코드 개체를 고려하세요.

  • 함수 func: a와 b는 동일한 정수 객체를 참조합니다(1000이 캐시된 정수 범위 내에 있으므로 Python에서 캐시함).
  • 대화형 명령: a와 b는 별도의 코드 블록에 정의되어 있기 때문에 서로 다른 정수 개체를 참조합니다.

결과적으로 a is b는 func 블록 내에서 True로 평가됩니다. 여기서 모든 정수는 별도의 개체가 생성되는 블록 외부에서는 False입니다.

주의 사항

다음 주의 사항에 유의하세요.

  • 한 줄 내에서 할당 문을 연결하면 결과가 발생할 수 있습니다. 진정한 신원 확인.
  • 모듈 수준 실행은 모듈의 단일 코드 블록으로 인해 True를 반환합니다.
  • 변경 가능한 객체와 관련된 테스트는 캐시되지 않기 때문에 항상 False를 반환합니다.

결론

신원 비교와 관련된 예상치 못한 동작을 해석하려면 Python의 코드 블록 개념을 이해하는 것이 필수적입니다. 불변 객체의 신원을 확인하는 데 유용하지만 캐싱에 의존하지 않으므로 값을 비교할 때 등호 연산자(==)를 사용하는 것이 좋습니다.

위 내용은 Python의 \'is\' 연산자가 다른 코드 블록에서 큰 정수와 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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