ホームページ >バックエンド開発 >Python チュートリアル >コードの実行方法に応じて 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) 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。