캐시되지 않은 정수를 사용한 is 연산자의 예기치 않은 동작
질문:
함수 내에서 is 연산자는 반환합니다. [-5, 256] 범위 밖의 두 정수 리터럴을 비교할 때는 참이지만 함수 밖에서 비교하면 거짓입니다. 이러한 불일치가 발생하는 이유는 무엇입니까?
답변:
tl;dr:
Python 인터프리터는 코드 블록을 단위로 실행합니다. . 기능은 단일 블록인 반면 대화형 명령은 별도의 블록입니다. 각 블록에는 정수를 포함한 자체 개체가 포함되어 있습니다. 따라서 함수 내에서 선언된 정수는 동일한 객체를 가리키지만 외부에서 선언된 정수는 그렇지 않습니다.
설명:
-
함수 :
- 코드 블록은 함수 내에서 정의됩니다.
- 블록 내의 리터럴(예: 1000)은 단일 객체로 저장됩니다.
- 객체 ID를 확인하므로 a와 b가 모두 동일한 객체를 가리키므로 함수 내의 a는 b가 True를 반환합니다.
-
대화형 명령:
- 각 명령은 별도의 코드 블록으로 실행됩니다.
- 각 블록 내의 리터럴은 별도의 개체로 저장됩니다.
- 는 개체 ID를 확인하고 개체가 리터럴이기 때문에 a는 b와 다르면 False를 반환합니다.
추가 관찰:
- 이 동작은 정수가 아닌 경우에도 적용됩니다. 리터럴(예: 부동 리터럴).
- Python은 사전을 사용하여 코드 객체 내에 상수를 저장하고 새 상수를 추가하기 전에 기존 상수를 확인합니다.
주의 사항:
-
연결된 문: 명령이 연결되면(예: a = b = 1000) 단일 코드 블록으로 해석되어 True로 이어집니다.
-
모듈 수준 실행: 모듈 수준 실행(예: a = b = 1000)은 단일 코드 블록 내에서 발생하며 결과는 True입니다.
-
변경 가능한 개체: 불일치는 변경 가능한 객체에는 적용되지 않습니다. a = b = []는 항상 False를 반환합니다.
위 내용은 'is' 연산자가 캐시되지 않은 정수 내부 및 외부 함수와 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!