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()
次に、デバッグコード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
それは時のことを意味cst
するためにast
変換、二つの異なるPyInt_Object
sが(実際にはそれがで行われます作成されているast_for_atom()
機能)、しかし、彼らは後にマージされます。
私はそれが困難でソースを理解するために見つけるPyAST_Compile
とPyEval_EvalCode
、私は助けを求めるためにここにいるので、いくつかのいずれかのヒントを与えた場合、私は感謝だろうか、?