Ich habe viele SO-Seiten darüber gelesen, wie die Änderung von veränderbaren Objekten außerhalb der Funktion reflektiert werden, aber unveränderliche Objekte (offensichtlich) nicht. Aber ich bin etwas verblüfft von diesem Code, wo ich dieselbe Liste an zwei verschiedene Sortierfunktionen sende, und die eine wird sie modifizieren, und die andere nicht.Python gleiche Liste wird um eine Funktion geändert und nicht von einem anderen
bubbleSort(mylist)
und es funktioniert gut, in dem Anrufer reflektierte mit dem midification von mylist werden:
def bubbleSort(mylist):
for i in range(len(mylist)):
for j in range(i,len(mylist)):
if mylist[i] > mylist[j]:
mylist[i], mylist[j] = mylist[j], mylist[i]
return mylist
Der BubbleSort() oben kann wie genannt werden. Sie können den Rückgabewert von bubbleSort() im Aufrufer vollständig ignorieren.
def mergeSort(mylist):
listSize = len(mylist)
shortSize = int(listSize/2)
if listSize == 1:
return (mylist)
mylistLeft = mergeSort(mylist[:shortSize])
mylistRight = mergeSort(mylist[shortSize:])
i, j = 0, 0
result = []
while (i < len(mylistLeft) and j < len(mylistRight)):
if mylistLeft[i] > mylistRight[j]:
result.append(mylistRight[j])
j += 1
else:
result.append(mylistLeft[i])
i += 1
result += mylistRight[j:]
result += mylistLeft[i:]
return result
Die MergeSort() hier nicht wie bei dem obigen Aufruf aufgerufen werden. Stattdessen muss ich es so nennen:
newlist = mergeSort(mylist)
und die newlist hat, was ich will, während mylist die unsortierte Liste. Also die bubbleSort() erfordert keine Rückgabeanweisung, während die mergeSort() ohne es nutzlos ist. Ich verstehe die Notwendigkeit der Rückkehr in Rekursion, aber ich erwartete, nicht den Rückgabewert in der aufrufenden Funktion verwenden zu müssen.
Also meine Frage ist, was ist der Unterschied? Sind die Variablen nicht in beiden Fällen veränderbar?
Oh ok. Also habe ich * mylist = result * ausprobiert, bevor ich vom ** mergoSort() ** zurückkehrte. Aber es funktioniert immer noch nicht. – DDauS
Das ändert auch nicht die ursprüngliche Liste. Es ändert nur, worauf die Variablenliste verweist. Z. B. versuche 'def foo (x): x = 5' und dann 'a = 4; foo (a) '. Das ändert den Wert von "a" nicht. – smarx
Ok, jetzt bin ich neugierig, kannst du mich auf ein gutes Tutorial dafür hinweisen? Je beschreibender, desto besser. – DDauS