Heim >Backend-Entwicklung >Python-Tutorial >Warum ändert sich das Integer-Cache-Verhalten von Python abhängig davon, wie der Code ausgeführt wird?

Warum ändert sich das Integer-Cache-Verhalten von Python abhängig davon, wie der Code ausgeführt wird?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-20 02:34:13275Durchsuche

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

Was ist mit dem vom Interpreter verwalteten Integer-Cache?

Nachdem ich Pythons Quellcode untersucht hatte, entdeckte ich ein Array von PyInt_Objects, die von int(- 5) zu int(256) (@src/Objects/intobject.c).

Das Ausführen eines kleinen Tests beweist es:

>>> a = 1
>>> b = 1
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

Allerdings, wenn diese Befehle zusammen in einer Py-Datei ausgeführt werden oder sie mit Semikolons verbinden, ändert sich das Ergebnis:

>>> a = 257; b = 257; a is b
True

Um zu verstehen, warum diese beiden Da Ganzzahlen immer noch auf dasselbe Objekt verweisen, habe ich mich mit dem Syntaxbaum und dem Compiler befasst und bin auf die folgende Aufrufhierarchie gestoßen:

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()

Dann habe ich Debugcode in PyInt_FromLong und vor/nach PyAST_FromNode integriert , und führte dann ein test.py-Skript aus:

a = 257
b = 257
print "id(a) = %d, id(b) = %d" % (id(a), id(b))

The Die Ausgabe lautet:

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

Dies zeigt an, dass während der CST-zu-Ast-Transformation (ausgeführt in ast_for_atom()) zwei separate PyInt_Objects generiert werden. Allerdings werden diese Objekte dann zusammengeführt.

Ich fand den Quellcode in PyAST_Compile und PyEval_EvalCode schwer zu verstehen und suchte daher Hilfe. Kann jemand Einblicke geben?

Das obige ist der detaillierte Inhalt vonWarum ändert sich das Integer-Cache-Verhalten von Python abhängig davon, wie der Code ausgeführt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn