\'is\' 연산자가 Python의 함수 내부 및 외부에서 캐시되지 않은 정수와 다르게 동작하는 이유는 무엇입니까?
Oct 31, 2024 pm 07:22 PM캐시되지 않은 정수를 사용한 '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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?
