Sind numpy Arrays durch Verweis übergeben?

Ich stieß auf die Tatsache, dass numpy Arrays durch Referenz an mehreren Orten übergeben werden, aber dann, wenn ich den folgenden Code ausführen, warum gibt es einen Unterschied zwischen dem Verhalten von foo und bar

 import numpy as np def foo(arr): arr = arr - 3 def bar(arr): arr -= 3 a = np.array([3, 4, 5]) foo(a) print a # prints [3, 4, 5] bar(a) print a # prints [0, 1, 2] 

Ich benutze Python 2.7 und numpy Version 1.6.1

2 Solutions collect form web for “Sind numpy Arrays durch Verweis übergeben?”

In Python sind alle Variablennamen Verweise auf Werte .

Wenn Python eine Zuordnung auswertet, wird die rechte Seite vor der linken Seite ausgewertet . arr - 3 erstellt ein neues Array; Es ändert nicht an Ort und Stelle.

arr = arr - 3 macht die lokale Variable auf dieses neue Array. Es ändert sich nicht den ursprünglich von arr Wert, der an foo . Der Variablenname wird einfach an das neue Array gebunden, arr - 3 . Darüber hinaus ist arr lokale Variablenname im Rahmen der foo Funktion. Sobald die foo Funktion abgeschlossen ist, gibt es keinen Bezug mehr auf arr und Python ist frei zu Müll sammeln den Wert, den es verweist. Wie Reti43 darauf hinweist , um den Wert von arr zu beeinflussen, muss er den arr und muss diesem Wert zugeordnet werden:

 def foo(arr): arr = arr - 3 return arr # or simply combine both lines into `return arr - 3` a = foo(a) 

Im Gegensatz dazu, arr -= 3 , die Python in einen Aufruf der __iadd__ Spezialmethode übersetzt , modifiziert das Array, das von arr in-place referenziert wird.

Die erste Funktion berechnet (arr - 3) und ordnet dann den lokalen Namen arr zu, was die np.array nicht beeinflusst. Meine Vermutung ist, dass in der zweiten Funktion np.array den -= Operator überschreibt und betreibt Anstelle der Array-Daten.

  • Python numpy float16 Datentyp Operationen und float8?
  • Warum ist Sünde (180) nicht null bei der Verwendung von Python und numpy?
  • Handhabung von Duplikatindizes in NumPy-Zuordnungen
  • Wie füge ich ein 'RowNumber' Feld zu einem strukturierten numpy Array hinzu?
  • Schnelle lineare Interpolation in Numpy / Scipy "entlang eines Weges"
  • Numpy - Modale Matrix und diagonale Eigenwerte
  • Wie lese ich eine 6 GB csv Datei mit Pandas
  • Wie konfiguriere ich die Farbe, wenn du das Numpy Array in QImage konvertierst?
  • Plotten mit mehreren Y-Achsen
  • Auswahl von Elementen basierend auf Komplement von Datensätzen in Python-Pandas
  • Numpy ungerade Verhalten Umwandlung in datetime64 dtype
  • Python ist die beste Programmiersprache der Welt.