Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Kelakuan Cache Integer Python Berubah Bergantung pada Cara Kod Dilaksanakan?

Mengapa Kelakuan Cache Integer Python Berubah Bergantung pada Cara Kod Dilaksanakan?

Patricia Arquette
Lepaskan: 2024-12-20 02:34:13
asal
246 orang telah melayarinya

Why Does Python's Integer Cache Behavior Change Depending on How the Code is Executed?

Ada apa dengan cache integer yang dikekalkan oleh penterjemah?

Selepas meneroka kod sumber Python, saya menemui tatasusunan PyInt_Objects yang dikekalkan, dari int(- 5) kepada int(256) (@src/Objects/intobject.c).

Menjalankan ujian kecil membuktikannya:

>>> a = 1
>>> b = 1
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
Salin selepas log masuk

Walau bagaimanapun, apabila menjalankan arahan ini bersama-sama dalam fail py atau menyertai mereka dengan koma bertitik, hasilnya berubah:

>>> a = 257; b = 257; a is b
True
Salin selepas log masuk

Untuk memahami mengapa kedua-duanya integer masih merujuk objek yang sama, saya menyelidiki pokok sintaks dan pengkompil dan menjumpai hierarki panggilan berikut:

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()
Salin selepas log masuk

Saya kemudiannya menyepadukan kod nyahpepijat ke dalam PyInt_FromLong dan sebelum/selepas PyAST_FromNode , kemudian menjalankan test.py skrip:

a = 257
b = 257
print "id(a) = %d, id(b) = %d" % (id(a), id(b))
Salin selepas log masuk

Outputnya ialah:

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
Salin selepas log masuk

Ini menunjukkan bahawa dua PyInt_Objects berasingan dijana semasa transformasi cst ke ast (dilaksanakan dalam ast_for_atom()); namun, objek ini kemudiannya digabungkan.

Saya mendapati kod sumber dalam PyAST_Compile dan PyEval_EvalCode sukar difahami, jadi saya meminta bantuan. Bolehkah seseorang menawarkan sebarang cerapan?

Atas ialah kandungan terperinci Mengapa Kelakuan Cache Integer Python Berubah Bergantung pada Cara Kod Dilaksanakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan