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 append
deepcopy
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.
Informieren Sie sich über unveränderliche vs veränderbare Objekte und Pass-by-Value vs Pass-by-Referenz –
Append kopiert nichts, weshalb Sie am Ende die gleiche Liste mehrmals in Ihrer Liste haben. – spectras