인터프리터가 유지 관리하는 정수 캐시는 어떻게 되나요?
Python의 소스 코드를 탐색한 후 int(- 5) 정수(256)로 (@src/Objects/intobject.c).
작은 테스트를 실행해 보면 다음과 같습니다.
>>> a = 1 >>> b = 1 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False
그러나 이러한 명령을 py 파일에서 함께 실행하면 또는 세미콜론으로 결합하면 결과가 나타납니다. 변경 사항:
>>> a = 257; b = 257; a is b True
이 두 정수가 여전히 동일한 개체를 참조하는 이유를 이해하기 위해 구문 트리와 컴파일러를 자세히 살펴보고 다음 호출 계층 구조를 발견했습니다.
PyRun_FileExFlags() mod = PyParser_ASTFromFile() node *n = PyParser_ParseFileFlagsEx() //source to cst parsetoke() ps = PyParser_New() for (;;) PyTokenizer_Get() PyParser_AddToken(ps, ...) mod = PyAST_FromNode(n, ...) //cst to ast run_mod(mod, ...) co = PyAST_Compile(mod, ...) //ast to CFG PyFuture_FromAST() PySymtable_Build() co = compiler_mod() PyEval_EvalCode(co, ...) PyEval_EvalCodeEx()
그런 다음 PyInt_FromLong과 PyAST_FromNode 전/후에 디버그 코드를 통합했습니다. 그런 다음 test.py 스크립트를 실행했습니다.
a = 257 b = 257 print "id(a) = %d, id(b) = %d" % (id(a), id(b))
출력은 다음과 같습니다.
DEBUG: before PyAST_FromNode name = a ival = 257, id = 176046536 name = b ival = 257, id = 176046752 name = a name = b DEBUG: after PyAST_FromNode run_mod PyAST_Compile ok id(a) = 176046536, id(b) = 176046536 Eval ok
이는 두 개의 개별 PyInt_Object가 생성되었음을 나타냅니다. cst에서 ast로 변환하는 동안(ast_for_atom()에서 실행됨) 그러나 이러한 개체는 통합됩니다.
PyAST_Compile 및 PyEval_EvalCode의 소스 코드가 이해하기 어렵다는 것을 발견하여 도움을 요청했습니다. 누군가 통찰력을 제공할 수 있습니까?
위 내용은 코드 실행 방법에 따라 Python의 정수 캐시 동작이 변경되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!