Python-Variablen sind Zeiger?

Variablen in Python sind nur Zeiger, soweit ich weiß.

Basierend auf dieser Regel kann ich davon ausgehen, dass das Ergebnis für dieses Code-Snippet:

i = 5 j = i j = 3 print(i) 

Wäre 3 . Aber ich habe ein unerwartetes Ergebnis für mich, es war 5 .

Darüber hinaus deckt mein Python-Buch dieses Beispiel ab:

 i = [1,2,3] j = i i[0] = 5 print(j) 

Das Ergebnis wäre [5,2,3] .

Was verstehe ich falsch?

7 Solutions collect form web for “Python-Variablen sind Zeiger?”

Wir nennen sie Referenzen. Sie arbeiten so

 i = 5 # create int(5) instance, bind it to i j = i # bind j to the same int as i j = 3 # create int(3) instance, bind it to j print i # i still bound to the int(5), j bound to the int(3) 

Kleine Inte sind interniert, aber das ist nicht wichtig für diese Erklärung

 i = [1,2,3] # create the list instance, and bind it to i j = i # bind j to the same list as i i[0] = 5 # change the first item of i print j # j is still bound to the same list as i 

Variablen sind keine Zeiger. Wenn Sie einer Variablen zuordnen, binden Sie den Namen an ein Objekt. Von diesem Zeitpunkt an können Sie sich auf das Objekt beziehen, indem Sie den Namen verwenden, bis dieser Name zurückprallt.

In deinem ersten Beispiel ist der Name an den Wert 5 gebunden. Das Binden von verschiedenen Werten an den Namen j hat keine Auswirkung auf i , also wenn Sie später den Wert von i drucken, ist der Wert immer noch 5 .

In deinem zweiten Beispiel binden Sie sowohl i als auch j auf das gleiche Listenobjekt. Wenn Sie den Inhalt der Liste ändern, können Sie die Änderung sehen, unabhängig davon, welchen Namen Sie verwenden, um auf die Liste zu verweisen.

Beachten Sie, dass es falsch wäre, wenn Sie sagten, dass sich beide Listen geändert haben. Es gibt nur eine Liste, aber es hat zwei Namen ( i und j ), die darauf verweisen.

Zugehörige Dokumentation

  • Ausführungsmodell – Benennung und Bindung

Python-Variablen sind Namen, die an Objekte gebunden sind

Aus den docs :

Namen beziehen sich auf Objekte. Namen werden durch Namensbindungsoperationen eingeführt. Jedes Vorkommen eines Namens im Programmtext bezieht sich auf die Bindung dieses Namens , der im innersten Funktionsblock mit der Verwendung festgelegt ist.

Wenn Sie das tun

 i = 5 j = i 

Das ist das gleiche wie zu tun:

 j = 5 

j zeigt nicht auf i , und nach der Zuweisung weiß i nicht, dass i existiere. j ist einfach an alles gebunden, was i zum Zeitpunkt der Abtretung zeigte.

Wenn du die Zuweisungen auf der gleichen Zeile gemacht hast, würde es so aussehen:

 i = j = 5 

Und das Ergebnis wäre genau das gleiche.

Später tun

 j = 3 

Ändert nicht was i darauf hindeute.

Ihr Beispiel gibt die Liste nicht ab

Also wenn du das machst:

 i = [1,2,3] j = i 

Es ist das gleiche wie dies zu tun:

 i = j = [1,2,3] 

So dass i und j beide auf die gleiche Liste zeigen. Dann mutiert dein Beispiel die Liste:

 i[0] = 5 

Python-Listen sind veränderliche Objekte, also wenn Sie die Liste aus einer Referenz ändern, und Sie sehen es aus einer anderen Referenz, sehen Sie das gleiche Ergebnis, weil es die gleiche Liste ist.

Sie sind nicht ganz Zeiger, sie sind Hinweise auf Gegenstände. Gegenstände können entweder veränderlich oder unveränderlich sein. Ein unveränderliches Objekt wird kopiert, wenn es modifiziert wird. Ein veränderliches Objekt wird an Ort und Stelle verändert. Eine Ganzzahl ist ein unveränderliches Objekt, das Sie durch Ihre i und j Variablen verweisen. Eine Liste ist ein veränderliches Objekt.

In deinem ersten Beispiel

 i=5 # The label i now references 5 j=i # The label j now references what i references j=3 # The label j now references 3 print i # i still references 5 

In deinem zweiten Beispiel:

 i=[1,2,3] # i references a list object (a mutable object) j=i # j now references the same object as i (they reference the same mutable object) i[0]=5 # sets first element of references object to 5 print j # prints the list object that j references. It's the same one as i. 

Wenn Sie j=3 das Label j nicht mehr (Punkte) auf i , es beginnt auf die Integer 3 . Der Name i beziehe i immer noch auf den ursprünglich eingestellten Wert.

Zuweisung beeinträchtigt keine Objekte; Alles was es tut, ist Veränderung, wo die Variablen Punkte. Ändern, wo sich ein variabler Punkt nicht ändern wird, wenn ein anderer Punkt zeigt.

Sie denken wahrscheinlich an die Tatsache, dass Arrays und Wörterbücher veränderliche Typen sind. Es gibt Operatoren, um die tatsächlichen Objekte an Ort und Stelle zu ändern, und wenn Sie eine davon verwenden, sehen Sie die Änderung in allen Variablen, die auf das gleiche Objekt zeigen:

 x = [] y = x x.append(1) # x and y both are now [1] 

Aber Zuordnung bewegt sich immer noch den Zeiger um:

 x = [2] # x is now [2], y is still [1] 

Zahlen sind Werttypen, dh die tatsächlichen Werte sind unveränderlich. Wenn du x=3; x += 2 machst x=3; x += 2 x=3; x += 2 , du drehst nicht die Nummer 3 in die Nummer 5; Du machst nur x Punkt auf 5 statt 3. Die 3 ist immer noch da draußen unverändert, und alle Variablen, die darauf hinweisen, sehen noch 3 als ihren Wert.

(In der eigentlichen Implementierung sind Zahlen wahrscheinlich keine Referenztypen, und die Variablen enthalten tatsächlich eine Darstellung des Wertes direkt, anstatt darauf zu zeigen, aber diese Unterscheidung ändert nicht die Semantik, bei der Werttypen betroffen sind.)

Was auch immer Variable auf der linken Seite von '=' Zeichen ist mit dem Wert auf der rechten Seite von '='

i = 5

j = i — j hat 5

j = 3 — j hat 3 (überschreibt den Wert von 5) aber nichts wurde in Bezug auf i geändert

print(i) – so druckt man 5

  • Zugriff auf die zugrunde liegende Struktur eines PyObjects
  • Holen Sie sich den Wert eines Cython Zeigers
  • C Zeiger Arithmetik in Python
  • Pythongeneratorobjekte und .join
  • Python ist die beste Programmiersprache der Welt.