2015-11-23 3 views
0

Когда я изменяю значение списка, другие списки также изменяются. Я не понимаю, почему они это делают.Эквивалентность списка питов

def successors(state): 

    stateup=state[:] 
    statedown=state[:] 
    stateright=state[:] 
    stateleft=state[:] 


    for i in range(len(state)): 
     for j in range(len(state)): 
      if state[i][j]==0: 
       x=i 
       y=j 

    stateup[x][y]=stateup[x+1][y] 
    stateup[x+1][y]=0 
    statedown[x][y]=statedown[x-1][y] 
    statedown[x-1][y]=0 
    stateright[x][y]=stateright[x][y-1] 
    stateright[x][y-1]=0 
    stateleft[x][y]=stateleft[x][y+1] 
    stateleft[x][y+1]=0 
    if x==0: 
     if y==0: 
      return [stateleft,stateup] 
     elif y==len(state)-1: 
      return [stateright,stateup] 
     else: 
      return [stateright,stateleft,stateup] 
    elif x==len(state)-1: 
     if y==0: 
      return [stateleft,statedown] 
     elif y==len(state)-1: 
      return [stateright,statedown] 
     else: 
      return [stateright,stateleft,statedown] 
    else: 
     return [stateright,stateleft,statedown,stateup] 

print successors([[1,2,3,4],[5,6,0,8],[9,10,11,12],[13,14,15,16]]) 

ответ

2

Переменные stateup statedown ... вы определили все мелкие экземпляры state. Потому что вы использовали [:], который делает мелкую копию списка. Поэтому изменение одного из них меняет их все. Вам необходимо их скопировать, используя copy.deepcopy(...). Для полного объяснения прочитать этот вопрос Deep copy a list in Python
и эту статью http://www.python-course.eu/deep_copy.php

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