Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verhält sich der Python-Operator „is“ bei großen Ganzzahlen in verschiedenen Codeblöcken unterschiedlich?

Warum verhält sich der Python-Operator „is“ bei großen Ganzzahlen in verschiedenen Codeblöcken unterschiedlich?

Susan Sarandon
Susan SarandonOriginal
2024-11-01 15:26:31328Durchsuche

Why Does Python's

Pythons Verhalten des „is“-Operators bei großen ganzen Zahlen

Problem

In Python prüft der is-Operator die Objektidentität und nicht die Äquivalenz. In bestimmten Szenarien kann dieses Verhalten jedoch unerwartet sein, wie unten gezeigt:

<code class="python">def func():
    a = 1000
    b = 1000
    return a is b

a = 1000
b = 1000

print(a is b, func())  # (False, True)</code>

Der is-Vergleich gibt innerhalb der Funktion True zurück, außerhalb jedoch False. Trotz der unterschiedlichen Auswertungsergebnisse scheinen die Ganzzahlen a und b den gleichen Wert zu haben.

Erklärung

Um dieses Verhalten zu verstehen, ist die Interpretation von Codeblöcken durch den Python-Interpreter von entscheidender Bedeutung. Laut Python-Referenzhandbuch stellt jeder interaktiv ausgeführte Befehl einen separaten Codeblock dar. Als Blöcke gelten:

  • Module
  • Funktionskörper
  • Klassendefinitionen

Innerhalb eines einzelnen Codeblocks speichert Python bestimmte Caches Objekte wie kleine Ganzzahlen (im Bereich [-5, 256]). Wenn mehrere Variablen auf dasselbe Ganzzahlliteral verweisen, verweisen sie alle auf dasselbe zwischengespeicherte Ganzzahlobjekt. Wenn die Literale jedoch in verschiedenen Codeblöcken deklariert werden, werden unterschiedliche Ganzzahlobjekte erstellt.

Unterschiedliche Codeobjekte, unterschiedliche Identitäten

Um dies zu veranschaulichen, betrachten Sie die Codeobjekte für jeden Fall:

  • Funktion func: a und b verweisen auf dasselbe Integer-Objekt (von Python zwischengespeichert, da 1000 innerhalb des zwischengespeicherten Integer-Bereichs liegt).
  • Interaktiv Befehle:a und b verweisen auf unterschiedliche Integer-Objekte, da sie in separaten Codeblöcken definiert sind.

Als Ergebnis wird a und b innerhalb des Funktionsblocks, in dem sich alle Integer befinden, als True ausgewertet zwischengespeichert und False außerhalb des Blocks, wo separate Objekte erstellt werden.

Vorbehalte

Beachten Sie die folgenden Einschränkungen:

  • Die Verkettung von Zuweisungsanweisungen innerhalb einer einzelnen Zeile kann zur Folge haben in True-Identitätsprüfungen.
  • Ausführungen auf Modulebene geben aufgrund des einzelnen Codeblocks für ein Modul „True“ zurück.
  • Tests mit veränderlichen Objekten geben immer „False“ zurück, da sie nicht zwischengespeichert werden.

Fazit

Das Verständnis des Konzepts der Codeblöcke in Python ist für die Interpretation unerwarteten Verhaltens bei Identitätsvergleichen von entscheidender Bedeutung. Während dies nützlich ist, um die Identität unveränderlicher Objekte zu überprüfen, wird empfohlen, den Gleichheitsoperator (==) zum Vergleichen von Werten zu verwenden, da er nicht auf Caching angewiesen ist.

Das obige ist der detaillierte Inhalt vonWarum verhält sich der Python-Operator „is“ bei großen Ganzzahlen in verschiedenen Codeblöcken unterschiedlich?. 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