Python의 소스 코드를 살펴본 PyInt_Object
후 int(-5)
~ int(256)
(@ src / Objects / intobject.c) 범위 의 s 배열을 유지하고 있음을 알게되었습니다.
약간의 실험이 그것을 증명합니다.
>>> 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()
그런 다음 일부 디버그 코드를 in PyInt_FromLong
및 before / after 에 추가 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
그것은 중에 있음을 의미 cst
하는 ast
변환, 두 개의 서로 다른 PyInt_Object
들 (실제로는 수행 것 생성 ast_for_atom()
기능),하지만 나중에 병합됩니다.
PyAST_Compile
및 의 출처를 이해하기가 어렵 기 PyEval_EvalCode
때문에 도움을 요청하기 위해 여기에 있습니다. 누군가가 힌트를 주면 감사하겠습니다.