2016-11-04 3 views
-1

Некоторые проблемы возникают при использовании метода append в python3.5. Код представленНедостаточная копия Python и глубокая копия с использованием метода append

# 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 прежний state, который был добавлен в basis, также изменяется одновременно. Это означает, что append автоматически использует deepcopy, что невозможно. Фактически, эта ошибка может быть исправлена, если мы явно используем basis(state.copy()).

С другой стороны, следующий простой код не показывает ошибки при использовании append

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

после x изменяется на x=5, b остается неизменным b=[3]. Это действительно озадачивает меня и кажется противоречивым с прежним примером.

+2

Читайте об неизменяемых vs изменяемых объектах и ​​передавайте по значению vs pass-by-reference –

+0

Append ничего не копирует, поэтому вы в конечном итоге имеете один и тот же список несколько раз в своем списке. – spectras

ответ

4

Как уже отмечалось в комментариях, в операции append нет копии. Таким образом, вам придется явно позаботиться об этом самим, например. заменив

basis.append(state) 

с

basis.append(state[:]) 

Операция нарезка с : создает копию state. Разум: он не копирует элементы списков, которые, хотя вы сохраняете только простые числа, а не объекты в своем списке, должны быть в порядке.

Смежные вопросы