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