インタプリタによって維持される整数キャッシュはどうなっているのですか?
Python のソース コードを調査した結果、int(- 5) int(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
これら 2 つの整数が依然として同じオブジェクトを参照する理由を理解するために、構文ツリーとコンパイラを詳しく調べたところ、次の呼び出し階層に遭遇しました。
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
これは、2 つの別々の PyInt_Object が存在することを示しています。 cst から ast への変換中に生成されます (ast_for_atom() で実行)。
PyAST_Compile と PyEval_EvalCode のソース コードを理解するのが難しいことがわかったので、助けを求めました。誰かが何か洞察を提供してもらえますか?
以上がコードの実行方法に応じて Python の整数キャッシュの動作が変わるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。