python3.5でappendメソッドを使用すると、いくつかの問題が発生します。コードは追加メソッドを使用したPythonのシャローコピーとディープコピー
# 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)
提示される期待される結果は、[[3,0,0],[2,1,0],...,[0,0,3]]
なければならないが、このコードは、すべての要素が間違った結果が最後の、即ち[[0,0,3],...,[0,0,3]]
と同じで発生します。私はそれをデバッグするためにpdbを使用して、state
が変更されると、basis
に追加された前のstate
も同時に変更されることがわかります。それはappend
が自動的にdeepcopy
を使用することを意味します。実際には、basis(state.copy())
を明示的に使用するとこのエラーは修正できます。一方
は、次の簡単なコードがx
後append
x=3
b=[]
b.append(x)
x=x+2
を使用してエラーを示していないがb
はb=[3]
変わらない、x=5
に変更されます。それは本当に私を困惑させ、元の例と矛盾しているようです。
変更可能なオブジェクトと値渡しの値渡しの比較 –
Appendは何もコピーしません。そのため、リストに同じリストが何度も残ることになります。 – spectras