>백엔드 개발 >파이썬 튜토리얼 >코드 실행 방법에 따라 Python의 정수 캐시 동작이 변경되는 이유는 무엇입니까?

코드 실행 방법에 따라 Python의 정수 캐시 동작이 변경되는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-20 02:34:13249검색

Why Does Python's Integer Cache Behavior Change Depending on How the Code is Executed?

인터프리터가 유지 관리하는 정수 캐시는 어떻게 되나요?

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

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