찾다
백엔드 개발파이썬 튜토리얼\'is\' 연산자가 Python의 함수 내부 및 외부에서 캐시되지 않은 정수와 다르게 동작하는 이유는 무엇입니까?

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

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

Pythonusesahybridmodelofilationandlostretation : 1) ThePyThoninterPretreCeterCompileSsourcodeIntOplatform-IndependentBecode.

Python은 해석 된 또는 편집 된 언어입니까? 왜 중요한가?Python은 해석 된 또는 편집 된 언어입니까? 왜 중요한가?May 12, 2025 am 12:09 AM

Pythonisbothingretedandcompiled.1) 1) it 'scompiledtobytecodeforportabilityacrossplatforms.2) thebytecodeisthentenningreted, withfordiNamictyTeNgreted, WhithItmayBowerShiledlanguges.

루프 대 파이썬의 루프 : 주요 차이점 설명루프 대 파이썬의 루프 : 주요 차이점 설명May 12, 2025 am 12:08 AM

forloopsareideal when

루프를위한 것 및 기간 : 실용 가이드루프를위한 것 및 기간 : 실용 가이드May 12, 2025 am 12:07 AM

forloopsareusedwhendumberofitessiskNowninadvance, whilewhiloopsareusedwhentheationsdepernationsorarrays.2) whiloopsureatableforscenarioScontiLaspecOndCond

파이썬 : 진정으로 해석 되었습니까? 신화를 파악합니다파이썬 : 진정으로 해석 되었습니까? 신화를 파악합니다May 12, 2025 am 12:05 AM

pythonisnotpurelynlogreted; itusesahybrideprophorfbyodecodecompilationandruntime -INGRETATION.1) pythoncompilessourcecodeintobytecode, thepythonVirtualMachine (pvm)

동일한 요소를 가진 Python Concatenate 목록동일한 요소를 가진 Python Concatenate 목록May 11, 2025 am 12:08 AM

ToconcatenatelistsinpythonwithesameElements, 사용 : 1) OperatorTokeEpduplicates, 2) asettoremovedUplicates, or3) listComperensionForControlOverDuplicates, 각 methodHasDifferentPerferformanCeanDorderImpestications.

해석 대 컴파일 언어 : Python 's Place해석 대 컴파일 언어 : Python 's PlaceMay 11, 2025 am 12:07 AM

PythonisancerpretedLanguage, 비판적 요소를 제시하는 PytherfaceLockelimitationsIncriticalApplications.1) 해석 된 언어와 같은 thePeedBackandbackandrapidProtoTyping.2) CompilledlanguagesLikec/C transformt 해석

루프를 위해 및 while 루프 : 파이썬에서 언제 각각을 사용합니까?루프를 위해 및 while 루프 : 파이썬에서 언제 각각을 사용합니까?May 11, 2025 am 12:05 AM

useforloopswhhenmerfiterationsiskNownInAdvance 및 WhileLoopSweHeniTesslationsDepoyConditionismet whilEroopsSuitsCenarioswhereTheLoopScenarioswhereTheLoopScenarioswhereTheLoopScenarioswhereTherInatismet, 유용한 광고 인 푸트 gorit

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구