ホームページ > バックエンド開発 > Python チュートリアル > コードの実行方法に応じて Python の整数キャッシュの動作が変わるのはなぜですか?

コードの実行方法に応じて Python の整数キャッシュの動作が変わるのはなぜですか?

Patricia Arquette
リリース: 2024-12-20 02:34:13
オリジナル
275 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート