2016-11-04 9 views
-1

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())を明示的に使用するとこのエラーは修正できます。一方

は、次の簡単なコードがxappend

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

を使用してエラーを示していないがbb=[3]変わらない、x=5に変更されます。それは本当に私を困惑させ、元の例と矛盾しているようです。

+2

変更可能なオブジェクトと値渡しの値渡しの比較 –

+0

Appendは何もコピーしません。そのため、リストに同じリストが何度も残ることになります。 – spectras

答えて

4

すでにコメントに記載されているように、append操作には何もコピーされていません。 これを明示的に行う必要があります。 :

basis.append(state[:]) 

スライシング操作に

basis.append(state) 

を置き換えることによってstateのコピーを作成します。 マインド:リストの要素はコピーされません。リスト内のオブジェクトではなく、単純な数値だけを保持している限り、問題ありません。

関連する問題