캐시되지 않은 정수를 사용한 '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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Pythonusesahybridmodelofilationandlostretation : 1) ThePyThoninterPretreCeterCompileSsourcodeIntOplatform-IndependentBecode.

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

forloopsareusedwhendumberofitessiskNowninadvance, whilewhiloopsareusedwhentheationsdepernationsorarrays.2) whiloopsureatableforscenarioScontiLaspecOndCond

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

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

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

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


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

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

WebStorm Mac 버전
유용한 JavaScript 개발 도구

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