2016-11-04 2 views
-1

Einige Probleme kommen heraus, wenn Append-Methode in Python 3.5 verwenden. Der Code wirdPython flache Kopie und tiefe Kopie mit Append-Methode

präsentiert
# generate boson basis in lexicographic order 
def boson_basis(L,N): 
basis=[] 
state=[0 for i in range(1,L+1)] 
pos=0 
# initialize the state to |N,0,...,0> 
state[0]=N 
basis.append(state) 
# find the first non-zero position in reverse order 
while state[L-1]<N: 
    for i in range(-2,-L-1,-1): 
     if state[i]>0: 
      pos=L+i 
      break 
    sum=0 
    for i in range(0,pos): 
     sum=sum+state[i] 
    state[pos]=state[pos]-1 
    state[pos+1]=N-sum-state[pos] 
    basis.append(state) 
return basis   

result=boson_basis(3,3) 

das erwartete Ergebnis [[3,0,0],[2,1,0],...,[0,0,3]] sein sollte, aber dieser Code erzeugt falsche Ergebnisse mit allen Elementen die gleiche wie die letzte, d.h. [[0,0,3],...,[0,0,3]]. Ich benutze die PDB, um es zu debuggen und ich finde, dass, sobald die state geändert wird, die ehemalige state, die in basis angefügt wurde, auch gleichzeitig geändert wird. Es impliziert, dass appenddeepcopy automatisch verwendet, was meines Wissens nicht zu verstehen ist. In der Tat kann dieser Fehler behoben werden, wenn wir explizit basis(state.copy()) verwenden.

Auf der anderen Seite, der folgende einfache Code zeigt keine Fehler append

x=3 
b=[] 
b.append(x) 
x=x+2 

nach x bei der Verwendung auf x=5 geändert, b bleibt b=[3] unverändert. Es verwirrt mich wirklich und scheint mit dem vorherigen Beispiel widersprüchlich zu sein.

+2

Informieren Sie sich über unveränderliche vs veränderbare Objekte und Pass-by-Value vs Pass-by-Referenz –

+0

Append kopiert nichts, weshalb Sie am Ende die gleiche Liste mehrmals in Ihrer Liste haben. – spectras

Antwort

4

Wie bereits in den Kommentaren erwähnt, gibt es keine Kopie in einer append Operation. Sie müssen sich also explizit selbst darum kümmern, z. durch

basis.append(state) 

mit

basis.append(state[:]) 

Der Schneidvorgang mit : erstellt eine Kopie state ersetzen. Achtung: Es kopiert nicht die Listenelemente - solange Sie jedoch nur einfache Zahlen und keine Objekte in Ihrer Liste behalten, sollte es in Ordnung sein.

Verwandte Themen