2016-06-22 10 views
0

Ich versuche, eine Kopie einer Liste an eine Funktion in Python zu übergeben, damit ich auf eine neue Liste pop und anhängen kann, ohne die Informationen in der alten Liste zu verlieren. Aber ich habe Probleme.Kopie einer Liste an eine Funktion in Python übergeben

hier ist mein Code

def show_magicians(magicians): 
    for magician in magicians: 
     print (magician.title()) 
     return magicians 

def make_great(magicians): 
    for magician in magicians: 
     new_magician = magicians.pop() 
     new_magicians.append(new_magician) 
     print (new_magician.title() + ", is a great magician!!") 
     return magicians 

new_magicians = [] 
magicians = ['merlin', 'blaine', 'agaybi', 'copperfield'] 
show_magicians(magicians) 
make_great(magicians[:]) 
print ('\n' , magicians) 
print ('\n' , new_magicians) 

Die zweite Funktion soll die Elemente aus der alten Liste der neuen und drucken Sie die einfache Erklärung für jeden ohne Entleerung der alten Liste verschieben. Das Problem ist, ich bekomme nur 1 Element gedruckt und das gleiche Element ist das einzige Element verschoben.

Was mache ich falsch?

+1

Sie ordnen die neue Liste, die von 'make_great' erstellt wurde, nicht zu, versuchen Sie' new_magicians = make_great (magicians [:]) ''. – jonrsharpe

+1

@RobertR Nein, das ist nicht das Problem - das OP * übergibt explizit eine flache Kopie mit der Slice-Notation '[:]'. Das Problem ist, dass das nichts mit 'new_magicians' zu tun hat! – jonrsharpe

+0

Danke für den Schnitt Jon Sharpe. Das ist meine erste Frage. –

Antwort

2

Sie sind nach dem ersten Magier zurückkehr

verarbeitet

Ändern der make_great Funktion wie folgt

def make_great(magicians): 
    for magician in magicians: 
     new_magician = magicians.pop() 
     new_magicians.append(new_magician) 
     print (new_magician.title() + ", is a great magician!!") 
    return magicians 
+0

Nun, es scheint nicht die Return-Anweisung tut etwas, weil ich es hashtagged und das gleiche Ergebnis passiert. Jetzt bekomme ich die alte Liste intakt aber nur die letzten beiden Elemente sind in die neue Liste gezogen !!!! –

+0

Die alte Liste ist intakt, weil Sie eine Kopie davon an Ihre Funktion senden, und das andere Problem liegt wahrscheinlich daran, dass Sie eine Liste ändern, während Sie darauf iterieren. Ihr Code ist sehr verwirrend, warum eine Liste als Parameter übergeben wird und nicht die andere? – polku

+0

Dies funktioniert nicht, da es Elemente aus der aufgelisteten Liste hervorhebt. – tdelaney

1

Die existing answer löst Ihre unmittelbare Problem, aber der Code ist immer noch unnötig verwirrend, was ich denke, dazu beigetragen, du bleibst stecken.

Der „richtige“ Weg, dies zu tun ist, mutiert magicians innerhalb make_great überhaupt zu vermeiden. Eine Python-Funktion, die ein veränderbares Argument wie dieses annimmt, sollte entweder ihr Argument mutieren und Noneoder ein neues Objekt erstellen und das zurückgeben. Es sollte sicherlich nicht (für so eine triviale Aufgabe zumindest) sowohl sein Argument als auch ein Objekt im umschließenden Gültigkeitsbereich und dieses zweite Objekt zurückgeben.

Zum Beispiel könnten Sie getan haben:

def make_great(magicians): 
    """Make each magician in the input great.""" 
    new_magicians = [] # create a brand new list 
    for name in magicians: # iterate over old list 
     new_magicians.append(name + ' is a great magician!') # add to new list 
    return new_magicians # note this is outside the for loop 

Dann müssen Sie außerhalb der Funktion nicht erstellen new_magicians oder eine Kopie des ursprünglichen magicians es passieren:

magicians = ['merlin', 'blaine', 'agaybi', 'copperfield'] 
new_magicians = make_great(magicians) 
print(magicians) # still the same 
print(new_magicians) # brand new list 
0

Ok, erst mal vielen Dank euch allen. Ich habe endlich das Problem herausgefunden und wie ich es lösen kann. Die Übung, an der ich gerade arbeite, möchte, dass ich das [:] verwende, um eine flache Kopie der Liste zu erstellen und sie durch eine Funktion zu übergeben, um eine neue Liste zu erstellen.

Das Problem war, dass ich die for Schleife, die die Anweisung druckt, innerhalb der Funktion statt außerhalb zu sein, um global zu sein.

Hier ist der neue und richtige Code:

def show_magicians(magicians): 
    for magician in magicians: 
     print (magician.title()) 


def make_great(magicians): 
    while magicians: 
     new_magician = magicians.pop() 
     new_magicians.append(new_magician) 


new_magicians = [] 
magicians = ['merlin', 'blaine', 'agaybi', 'copperfield'] 
show_magicians(magicians) 
make_great(magicians[:]) 

for magician in magicians: 
    print ('\n' + magician.title() + " is a great magician!!") 

print ('\n') 
print (magicians) 
print ('\n') 
print (new_magicians) 

Nochmals vielen Dank und sorry für die Verwirrung.