Warum verhält sich der \'is\'-Operator bei nicht zwischengespeicherten Ganzzahlen innerhalb und außerhalb einer Funktion in Python unterschiedlich?

Mary-Kate Olsen
Freigeben: 2024-10-31 19:22:02
Original
256 Leute haben es durchsucht

Why does the 'is' operator behave differently with non-cached integers inside and outside a function in Python?

Das unerwartete Verhalten des „is“-Operators bei nicht zwischengespeicherten Ganzzahlen

Anfrage

Beim Experimentieren mit Pythons Interpreter wurde ein Paradoxon bezüglich des „ ist'-Operator. Insbesondere gibt „is“ „True“ zurück, wenn es innerhalb einer Funktion ausgewertet wird, aber „False“, wenn es außerhalb davon ausgewertet wird:

>>> def func():
...     a = 1000
...     b = 1000
...     return a is b
...

>>> a = 1000
>>> b = 1000
>>> a is b, func()
(False, True)
Nach dem Login kopieren

Da „is“ die „id“ des Objekts auswertet, impliziert dies, dass innerhalb der „func“-Funktion „a“ und „b“ beziehen sich auf dieselbe int-Instanz. Außerhalb der Funktion verweisen sie jedoch auf unterschiedliche Objekte. Warum ist das so?

Erklärung

Das Python-Referenzhandbuch bietet eine aufschlussreiche Erläuterung:

„Ein Block ist ein Stück Python-Programmtext, der als Einheit ausgeführt wird.“ . Jeder interaktiv eingegebene Befehl ist ein Block. Geben Sie den gleichen Wert zurück, was zu einer True-Auswertung führt.

Außerhalb der Funktion haben wir zwei separate Codeobjekte, jedes mit seinem Objekt für 1000. Daher sind 'id(a)' und 'id(b) ' sind unterschiedlich, was zu einer falschen Auswertung führt.

Diese Eigenart gilt nicht nur für Ganzzahlen. Ähnliche Ergebnisse werden beispielsweise mit Float-Literalen beobachtet. Denken Sie daran, dass vom Vergleich von Objekten auf Identität (mithilfe von „ist“) generell abgeraten wird; Stattdessen sollte der Gleichheitsoperator ('==') verwendet werden.

Code-Demonstration

Um ein klareres Verständnis zu erlangen, können wir uns in die Codeobjekte für beide Fälle vertiefen:

Innerhalb der Funktion „func“:

Wir haben eine einzelne „int“-Instanz für 1000, die sowohl „a“ als auch „b“ zugewiesen ist.
>>> print(dis.code_info(func))
...
Constants:
   0: None
   1: 1000
Nach dem Login kopieren

Außerhalb der Funktion „func“:

Wir sehen, dass jedes Codeobjekt seine Instanz von 1000 hat, was zur Falschauswertung führt.
>>> com1 = compile("a=1000", filename="", mode="single")
>>> com2 = compile("b=1000", filename="", mode="single")
>>> id(com1.co_consts[0]) == id(com2.co_consts[0])
False
Nach dem Login kopieren

Hinweise

Diese Beobachtung bezieht sich auf CPython, die am weitesten verbreitete Python-Implementierung.
  • Verkettete Anweisungen werden für „ist“ als „True“ ausgewertet, da sie als einzelner Codeblock behandelt werden.
  • Die Ausführung auf Modulebene ergibt ebenfalls True.
  • Identitätsprüfungen mit „is“ werden für veränderliche Objekte nicht empfohlen, da sie immer als False ausgewertet werden.

Das obige ist der detaillierte Inhalt vonWarum verhält sich der \'is\'-Operator bei nicht zwischengespeicherten Ganzzahlen innerhalb und außerhalb einer Funktion in Python unterschiedlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!