2017-09-04 2 views
-2

Ich verwende Python 3.4.2Python Liste kehrt Zeiger

def change(list_3,n): 
    list_3[n] = 'x' 
    return list_3 

def simulate(list_2): 
    list_4 = [] 
    for i in range(len(list_2)): 
     list_4.append(change(list_2,i)) 
    return list_4 

list_1 = [' ',' '] 
simulate(list_1) 

, wenn ich diesen Code ausführen würde ich erwarten, dass es zurück an: [['x',' '],[' ','x']] sondern es gibt [['x','x'],['x','x']] und es ändert mich list_1 zu ['x','x']. Es scheint, dass dies daran liegt, dass die Funktionsänderung einen Zeiger erhält, der sie zum Bearbeiten von list_1 macht. Und es gibt auch einen Zeiger zurück, der bewirkt, dass list_4 sich selbst aktualisiert, wenn list_1 geändert wird.

Weiß jemand, wie ich Python bekommen kann, um zu übertragen, was wirklich in der Liste ist, anstatt einen Zeiger zu geben?

+0

erste Fehler in Simulieren Funktion 'für i, Artikel in enumerate (Liste) und list_4.append (ändern (Liste, i)) : 'Ändere' Liste 'zu' Liste_2' – Kallz

Antwort

0

Denken Sie nicht an die Liste als Zeiger, denken Sie an sie als ein Objekt. Dieses Objekt ist veränderbar. Python erstellt keine neuen Objekte als Nebeneffekte (in Ihrem Namespace), so dass jedes neue Objekt in einer Zeile mit Zuweisung sein müsste, z. = oder return irgendwo.

In Ihrer Frage rufen Sie list_3[n] = 'x' auf und geben die gleiche Liste zurück. Wenn Sie ein Duplikat (z. B. list(list_3) oder list_3[:]) zurückgegeben haben, würden Sie sehen, was Sie erwarten.

Zur weiteren erarbeiten - prüfen, den Code neu zu schreiben wie folgt (Funktionen Verflachung und das Hinzufügen eines Druck):

list_1 = [' ',' '] 
list_4 = [] 
list_1[0] = 'x' 
list_4.append(list_1) 
list_1[1] = 'x' 
list_4.append(list_1) 
print list_4 

Wesentlichen die Tatsache, dass Ihr Wert aus einer Funktion zurückgegeben wird, bedeutet nicht, Du bekommst eine neue Kopie. Da außerdem append keine Kopie erstellt, werden beide Referenzen auf list_1 mit der Zeile list_1[1] aktualisiert.

0

Das ist, weil Liste veränderbar sind. Wenn der Datentyp veränderbar ist, übergibt Python den Adresszeiger, deshalb fügen Sie x zur selben Liste hinzu und list4 enthält auch die gleiche Liste im gesamten Index.

Entweder die Logik verändern oder unveränderlichen Datentyp wie Tupel verwenden

0
def change(list_3,n): 
    list_3[n] = 'x' 
    return list_3 

def simulate(list_2): 
    list_4 = [] 
    for i in range(len(list_2)): 
     list_4.append(change(list(list_2), i)) # this is where I've made my change. I've added the list keyword so that instead of appending the variable name "list_1", the items in list_1 are appended into list_4 
    return list_4 

list_1 = [' ', ' '] 
print(simulate(list_1))