Ich habe ein Problem mit einer Listenkopie:
Nachdem ich E0
von gekommen 'get_edge'
bin, mache ich eine Kopie, E0
indem ich anrufe 'E0_copy = list(E0)'
. Hier E0_copy
ist wohl eine tiefe Kopie von E0
und ich gehe E0_copy
hinein 'karger(E)'
. Aber in der Hauptfunktion.
Warum ist das Ergebnis 'print E0[1:10]'
vor der for-Schleife nicht dasselbe wie nach der for-Schleife?
Unten ist mein Code:
def get_graph():
f=open('kargerMinCut.txt')
G={}
for line in f:
ints = [int(x) for x in line.split()]
G[ints[0]]=ints[1:len(ints)]
return G
def get_edge(G):
E=[]
for i in range(1,201):
for v in G[i]:
if v>i:
E.append([i,v])
print id(E)
return E
def karger(E):
import random
count=200
while 1:
if count == 2:
break
edge = random.randint(0,len(E)-1)
v0=E[edge][0]
v1=E[edge][1]
E.pop(edge)
if v0 != v1:
count -= 1
i=0
while 1:
if i == len(E):
break
if E[i][0] == v1:
E[i][0] = v0
if E[i][1] == v1:
E[i][1] = v0
if E[i][0] == E[i][1]:
E.pop(i)
i-=1
i+=1
mincut=len(E)
return mincut
if __name__=="__main__":
import copy
G = get_graph()
results=[]
E0 = get_edge(G)
print E0[1:10] ## this result is not equal to print2
for k in range(1,5):
E0_copy=list(E0) ## I guess here E0_coypy is a deep copy of E0
results.append(karger(E0_copy))
#print "the result is %d" %min(results)
print E0[1:10] ## this is print2
Antworten:
E0_copy
ist keine tiefe Kopie. Sie erstellen keine tiefe Kopie mitlist()
(Beidelist(...)
undtestList[:]
sind flache Kopien).Sie verwenden
copy.deepcopy(...)
zum tiefen Kopieren einer Liste.Siehe den folgenden Ausschnitt -
Nun sehen Sie die
deepcopy
Operationquelle
Ich glaube, viele Programmierer sind auf ein oder zwei Interviewprobleme gestoßen, bei denen sie gebeten werden, eine verknüpfte Liste tief zu kopieren. Dieses Problem ist jedoch schwieriger als es sich anhört!
In Python gibt es ein Modul namens "copy" mit zwei nützlichen Funktionen
copy () ist eine flache Kopierfunktion. Wenn das angegebene Argument eine zusammengesetzte Datenstruktur ist, beispielsweise eine Liste , erstellt Python ein anderes Objekt des gleichen Typs (in diesem Fall eine neue Liste ), jedoch für alles in der alten Liste. nur ihre Referenz wird kopiert
Intuitiv könnten wir annehmen, dass deepcopy () dem gleichen Paradigma folgt, und der einzige Unterschied besteht darin, dass wir für jedes Element rekursiv Deepcopy nennen (genau wie die Antwort von mbcoder).
aber das ist falsch!
deepcopy () behält tatsächlich die grafische Struktur der ursprünglichen Verbindungsdaten bei:
Dies ist der schwierige Teil. Während des Deepcopy () -Prozesses wird eine Hashtabelle (Wörterbuch in Python) verwendet, um Folgendes abzubilden: "old_object ref auf new_object ref". Dies verhindert unnötige Duplikate und bewahrt somit die Struktur der kopierten zusammengesetzten Daten
offizielles Dokument
quelle
Wenn der Inhalt der Liste primitive Datentypen sind, können Sie ein Verständnis verwenden
Sie können es für mehrdimensionale Listen verschachteln wie:
quelle
Wenn Sie es
list elements
sindimmutable objects
, können Sie dies verwenden, andernfalls müssen Sie esdeepcopy
vomcopy
Modul aus verwenden.Sie können auch den kürzesten Weg für eine tiefe Kopie
list
wie diese verwenden.quelle
nur eine rekursive Deep Copy-Funktion.
Bearbeiten: Wie Cfreak erwähnt, ist dies bereits im
copy
Modul implementiert .quelle
deepcopy()
imcopy
Modul neu zu implementierenIn Bezug auf die Liste als Baum kann die deep_copy in Python am kompaktesten als geschrieben werden
quelle
Hier ist ein Beispiel für das tiefe Kopieren einer Liste:
quelle
Das ist mehr pythonisch
HINWEIS: Dies ist bei einer Liste der referenzierten Objekte nicht sicher
quelle