Python-Identität: Multiple Persönlichkeitsstörung, Code-Verkleinerung erforderlich [duplizieren]

Mögliche Duplikate:
Der Python-Operator "is" verhält sich bei Ganzzahlen unerwartet

Ich bin auf folgendes gestoßenPython Verrücktheit:

>>> two = 2
>>> ii = 2

>>> id(two) == id(ii)
True
>>> [id(i) for i in [42,42,42,42]]
[10084276, 10084276, 10084276, 10084276]

>>> help(id)
Help on built-in function id in module __builtin__:

id(...)
    id(object) -> integer

    Return the identity of an object.  This is guaranteed to be unique among
    simultaneously existing objects.  (Hint: it's the object's memory address.)
Ist jede Zahl ein Unikat?Sind verschiedene Variablen, die dieselben Elementwerte enthalten (z. B. zwei, ii), dasselbe Objekt?Wie wird die ID einer Nummer von Python generiert?Sind im obigen Beispiel zwei und ii Zeiger auf eine Speicherzelle, die den Wert 2 enthält? Das wäre extrem komisch.

Hilf mir, diese Identitätskrise zu entwirren.

Noch ein paar Verrücktheiten:

>>> a,b=id(0),id(1)
>>> for i in range(2,1000):
   a,b=b,id(i)
   if abs(a-b) != 12:
    print('%i:%i -> %i' % (i,a,b))

Der obige Code überprüft, ob IDs aufeinanderfolgender Ganzzahlen ebenfalls aufeinanderfolgend sind, und gibt Anomalien aus:

77:10083868 -> 10085840
159:10084868 -> 10086840
241:10085868 -> 10087840
257:10087660 -> 11689620
258:11689620 -> 11689512
259:11689512 -> 11689692
260:11689692 -> 11689548
261:11689548 -> 11689644
262:11689644 -> 11689572
263:11689572 -> 11689536
264:11689536 -> 11689560
265:11689560 -> 11689596
266:11689596 -> 11689656
267:11689656 -> 11689608
268:11689608 -> 11689500
331:11688756 -> 13807288
413:13806316 -> 13814224
495:13813252 -> 13815224
577:13814252 -> 13816224
659:13815252 -> 13817224
741:13816252 -> 13818224
823:13817252 -> 13819224
905:13818252 -> 13820224
987:13819252 -> 13821224

Beachten Sie, dass ab 413 ein Muster entsteht. Vielleicht liegt es an einigem Voodoo-Accounting am Anfang jeder neuen Speicherseite.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage