\'is\' 연산자가 Python의 함수 내부 및 외부에서 캐시되지 않은 정수와 다르게 동작하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-31 19:22:02
원래의
331명이 탐색했습니다.

Why does the 'is' operator behave differently with non-cached integers inside and outside a function in Python?

캐시되지 않은 정수를 사용한 'is' 연산자의 예상치 못한 동작

문의

파이썬 인터프리터로 실험하던 중 ' is' ​​연산자입니다. 특히 'is'는 함수 내에서 평가할 때 True를 반환하지만 함수 외부에서 평가할 때는 False를 반환합니다.

>>> def func():
...     a = 1000
...     b = 1000
...     return a is b
...

>>> a = 1000
>>> b = 1000
>>> a is b, func()
(False, True)
로그인 후 복사

'is'는 객체의 'id'를 평가하므로 이는 'func' 함수 내에서 다음을 의미합니다. 'a'와 'b'는 동일한 int 인스턴스를 참조합니다. 그러나 함수 외부에서는 다른 개체를 참조합니다. 왜 그럴까요?

설명

Python 참조 매뉴얼은 통찰력 있는 설명을 제공합니다.

"블록은 하나의 단위로 실행되는 Python 프로그램 텍스트 조각입니다. . 대화형으로 입력된 각 명령은 블록입니다."

함수 내에는 숫자 1000에 대해 하나의 개체만 포함하는 단일 코드 블록이 존재합니다. 따라서 'id(a)' 및 'id(b)' 동일한 값을 반환하면 True 평가가 발생합니다.

함수 외부에는 각각 1000에 대한 개체를 갖는 두 개의 별도 코드 개체가 있습니다. 따라서 'id(a)' 및 'id(b) '가 다르기 때문에 잘못된 평가로 이어집니다.

이러한 특징은 정수에만 국한되지 않습니다. 예를 들어 부동 소수점 리터럴에서도 비슷한 결과가 관찰됩니다. 객체의 정체성을 비교하는 것('is' 사용)은 일반적으로 권장되지 않습니다. 대신 항등 연산자('==')를 사용해야 합니다.

코드 데모

더 명확하게 이해하기 위해 두 경우 모두에 대한 코드 개체를 자세히 살펴볼 수 있습니다.

'func' 함수 내:

>>> print(dis.code_info(func))
...
Constants:
   0: None
   1: 1000
로그인 후 복사

'a'와 'b' 모두에 할당된 1000에 대한 단일 'int' 인스턴스가 있습니다.

'func' 함수 외부:

>>> com1 = compile("a=1000", filename="", mode="single")
>>> com2 = compile("b=1000", filename="", mode="single")
>>> id(com1.co_consts[0]) == id(com2.co_consts[0])
False
로그인 후 복사

각 코드 객체에는 1000의 인스턴스가 있어 False 평가로 이어지는 것을 볼 수 있습니다.

참고

  • 이 관찰은 가장 널리 사용되는 Python 구현인 CPython과 관련이 있습니다.
  • 연결된 문은 단일 코드 블록으로 처리되므로 'is'에 대해 True로 평가됩니다.
  • 모듈 수준에서 실행해도 True가 반환됩니다.
  • 'is'를 사용한 신원 확인은 항상 False로 평가되므로 변경 가능한 객체에 권장되지 않습니다.

위 내용은 \'is\' 연산자가 Python의 함수 내부 및 외부에서 캐시되지 않은 정수와 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿