kann mir jemand plz sagen, warum dieser Code leere "res" Variable generieren? Wenn Sie die kommentierte Zeile auskommentieren und darunter entfernen, funktioniert alles einwandfrei.Python DFS, kann nicht herausfinden, warum Rückkehrliste leer ist, wenn append/pop() aber funktioniert für [] + [] in rekursivem Aufruf
Codes nicht:
class Solution(object):
def dfs(self, nums, res, line):
if not nums:
print(line)
res.append(line)
return
for i, num in enumerate(nums):
line.append(num)
# self.dfs(nums[:i]+nums[i+1:], res, line+[num])
self.dfs(nums[:i]+nums[i+1:], res, line)
line.pop()
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
self.dfs(nums, res, [])
print(res)
return res
if __name__ == "__main__":
Solution().permute([1,2])
feine Arbeiten, wenn auf veränderte: die DFS für die Weitergabe
for i, num in enumerate(nums):
self.dfs(nums[:i]+nums[i+1:], res, line+[num])
außer der Verwendung von anhängen/pop. Selbst die "line" Variable vor dem Anhängen an "res" ist korrekt.
Hat das etwas mit Referenzieren zu tun? Das einzige, woran ich denken konnte, ist, was auch immer an Res weitergegeben wurde. Ich würde mich sehr freuen, wenn mir jemand den Link zur Referenz zeigen könnte.
danke für Ihre Antwort. In diesem Beispiel, nachdem der DFS-Aufruf beendet wurde, wurde die Zeilenvariable bereinigt, ebenso wie die in res []. aber warum wird das neue Listenobjekt "list + [num]" nicht aufgeräumt? Sind sie der gleiche Typ von lokalen Variablen, die nur im DFS-Aufruf existieren? – CSY
Nein, wie gesagt, wenn das übergebene Argument eine Liste (oder ein Objekt im Allgemeinen) ist, ist es pass-by-reference, dh das physische Objekt ist nach dem Ende des Funktionsaufrufs immer noch da, dh dfs(). Ich bin nicht sicher über diesen Teil, aber ich glaube, dass Python einige Garbage-Collection-Mechanismen implementiert. Wenn das Listenobjekt nicht von einer Variablen referenziert wird, bleibt das Objekt am Leben. – TimeString
Die Python-Aufrufsemantik ist [nicht auf Referenz verweisen] (https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference), weil das empfangende Ende das Objekt erhält, keine Referenz darauf. – bignose