Некоторые проблемы возникают при использовании метода 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]
. Это действительно озадачивает меня и кажется противоречивым с прежним примером.
Читайте об неизменяемых vs изменяемых объектах и передавайте по значению vs pass-by-reference –
Append ничего не копирует, поэтому вы в конечном итоге имеете один и тот же список несколько раз в своем списке. – spectras