Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Wie gebe ich eine Variable durch Verweis?                                      26 Antworten                          
  •     
    

Wenn Sie eine Sammlung wie Liste übergeben, Array an einem anderen Funktion in Python, ist es eine Kopie davon machen, oder ist es nur ein Zeiger?

War es hilfreich?

Lösung

werden Referenzen zu Objekten Wert .

  

Python werden Referenzen zu Objekten   Wert (wie Java), und alles, was in   Python ist ein Objekt. Das klingt   einfach, aber dann werden Sie feststellen, dass   einige Datentypen scheinen zu zeigen   Pass-by-Werteigenschaften, während   andere scheinen zu handeln, wie   Pass-by-reference ... was ist das Problem?

     

Es ist wichtig, zu verstehen, wandelbar   und unveränderliche Objekte. Einige Objekte,   wie Strings, Tupel und Zahlen, sind   unveränderlich. Ändern Sie sie in ein   Funktion / Methode wird eine neue erstellen   Instanz und die ursprüngliche Instanz   außerhalb der Funktion / Methode nicht   geändert. Andere Aufgaben, wie Listen   und Wörterbücher sind wandelbar, die   bedeutet, können Sie das Objekt ändern   an Ort und Stelle. Daher verändern ein   Objekt innerhalb einer Funktion / Methode wird   ändert auch das ursprüngliche Objekt   außerhalb.

Andere Tipps

Das Ding ist, wird das gesamte Bezug / Wert-Konzept nicht in Python passen. Python hat keinen „Wert“ einer Variablen. Python hat nur Objekte und Namen, die sich auf Objekte beziehen.

Also, wenn Sie eine Funktion aufrufen und einen „Namen“ in der Klammer setzen, wie folgt aus:

def func(x): # defines a function that takes an argument
    ... # do something here

func(myname) # calling the function

Das eigentliche Objekt, das myname zeigt übergeben wird, nicht die Namen myname selbst . Innerhalb der Funktion ein anderer Name (x) mit dem gleichen Objekt übergeben beziehen gegeben.

Sie können das Objekt innerhalb der Funktion ändern, wenn es wandelbar ist, aber Sie nicht ändern kann, was die Außen Namen zeigt. Genau das gleiche passiert, wenn Sie tun

anothername = myname

Deshalb kann ich Ihre Frage beantworten mit:

es "nach Wert übergeben", aber alle Werte sind nur Verweise auf Objekte.

Antworten hier hilfreich gewesen, aber ich finde die Notwendigkeit, diese feine Unterscheidung zu zeigen, die ich bedeckt nicht gesehen habe, die ich mit dem nachfolgenden CL Experiment mir bewiesen haben:

  1. Ein unveränderliches Objekt allein kann nicht innerhalb eines Funktionsaufruf geändert werden. (Antworten bisher gesagt haben, dass viel ...)
  2. ABER, ein unveränderliches Objekt innerhalb eines veränderlichen Objekts enthalten ist, kann in einem Methodenaufruf neu zugeordnet werden.

'num' nicht ändern, weil es ein unveränderliches Number-Objekt ist [unterstützt meine Nummer 1.]:

def incr_num(num):
    num += 1

num = 0

num
0

incr_num(num)

num
0

'Liste [0]' hier ist ein unveränderliches Number-Objekt auch.

def incr_list(list):
    list[0] += 1

list = [0]

list[0]
0

incr_list(list)

list[0]
1

Wie kommt Liste [0] ', ein unveränderliche Zahl Objekt ist, ändern (unterstützt meinen Punkt 2.), während die Zahl Objekt obigen Beispiel ‚num‘ nicht? Das unveränderliche Number-Objekt Liste [0] 'wird innerhalb der wandelbaren Liste Objekts enthält ‚Liste‘, während ‚num‘ aus dem ersten Beispiel ist nur ein nicht-contianed Number-Objekt.

Obwohl gut gemeint, ich fühle mich @Stephen Pape top-rated Antwort (unten zitiert), und einig andere ähnliche, waren nicht ganz korrekt (und das motiviert mich diese Antwort zu schreiben):

  

Einige Objekte, wie Strings, Tupel und Zahlen, sind unveränderlich.   sie innerhalb einer Funktion / Methode ändern wird eine neue Instanz erstellen und   die ursprüngliche Instanz außerhalb der Funktion / Methode wird nicht verändert.

Mein zweiter Code Experiment oben zeigt ein Number-Objekt (Liste [0] ') innerhalb eines Verfahrens verändert wird, und dann wird die ursprüngliche Instanz außerhalb der Funktion geändert.

Eine Referenz übergeben wird, aber wenn der Parameter ist ein unveränderliches Objekt, das innerhalb des Verfahrens modifiziert wird eine neue Instanz erstellen.

Das Objekt wird übergeben. Keine Kopie, sondern ein Verweis auf das darunter liegende Objekt.

würde ich auch am copy Modul empfehlen, ich:

Python-Dokumentation für die Kopie

Es wird Ihnen helfen, die zugrunde liegenden Probleme zu verstehen und wie es zu benutzen, um Ihre eigene tiefe Kopie auszuführen.

Mit dem Verweis:

>>> x = [0,1,2,3]
>>> def foo(x_list):
    x_list[0] = 1


>>> foo(x)
>>> x
[1, 1, 2, 3]

Bitte lassen Sie mich ein bescheidenes Beispiel geben

def swap(a, b):
    x = a
    print id(x)
    print id(a)
    print id(b)
    a = b

    print id(a)
    b = x
    print id(b)
    a[0]= '20'




var1 = ['1','2','3','4']
var2 = ['5','6','7','8','9']
print id(var1)
print id(var2)

swap(var1, var2)

print id(var1)
print id(var2)
print var1
print var2

, welche erzeugt das folgende Ergebnis

28329344 var1 28331264 var2 28329344 x 28329344 ein 28331264 b Nach = b 28331264 ein nach b = x 28329344 b nach der Rückkehr 28329344 var1 28331264 var2 [ '1', '2', '3', '4'] [ '20', '6' '7' '8' '9']

Zuordnung zu den Speicheradressen 28329344 28331264 var1 var2 a b X Nach = b                          ein Nach b = x b Nach einem [0] '20' =                          [0] '20' = nach der Rückkehr [ '1', '2', '3', '4'] [ '20', '6' '7' '8' '9']

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top