2017-05-14 1 views
1
class Area(): 
    def __init__(self, pos, desc): 
     self.pos = pos 
     self.desc = desc 

area1 = Area([0,0], "desc") 
area2 = Area([0,1], "desc") 
area3 = Area([0,2], "desc") 
area4 = Area([1,1], "desc") 
area5 = Area([2,1], "desc") 
area6 = Area([3,1], "desc") 
area7 = Area([3,2], "desc") 

map_coordinates = [area1.pos, area2.pos, area3.pos, area4.pos, area5.pos, area6.pos, area7.pos] 
player_pos = area1.pos 

print type(map_coordinates) 
print type(map_coordinates[2]) 
print type(player_pos) 

def command(x): 
    print "\n" #Just for readability 
    global player_pos 
    old_pos = player_pos 
    if x == "north": 
     player_pos[1] += 1 
    if player_pos not in map_coordinates: 
     player_pos = old_pos 
     print "Can't go that way" 
    else: 
     print "You go north" 

while True: 
    x = raw_input("type 'north' ") 
    command (x) 
    print player_pos 

여기서 내가하려는 것은 좌표가 map_coordinates에 있으면 북쪽으로 가고, 범위를 벗어난다면 멈추게하는 것입니다. 그러나 대신에 플레이어가 북쪽으로 영원히 갈 수 있고 "그 길을 갈 수 없다"는 것은 결코 인쇄되지 않습니다. 내 생각 엔 'in'키워드는 훌륭하게 재생되지 않지만 모든 유형은 목록입니다.Python : 함께 작업하고 싶지 않은 목록

+0

'map_coordinates'는'list's의'list'이다. –

답변

4

문제는 이전 목록을 기반으로 새 값으로 새 목록을 만드는 대신 목록을 수정하는 것입니다.

줄이 모두 player_pos = area1.pos 또는 old_pos = player_pos 인 경우 새 목록이 만들어지지 않습니다. 대신 첫 번째 Area 호출에서 생성 된 동일한 2 요소 목록에 대한 새 참조를 만듭니다. player_pos의 내용을 수정할 때마다 목록이 참조되는 다른 곳에서도 동일한 변경 사항을 볼 수 있습니다 (따라서 area1.pos, map_coordinates[0], player_posold_pos 모두 동일한 변경 사항이 표시됨).

위의 두 줄을 모두 새 참조를 만드는 대신 목록 내용을 복사하여 문제를 해결할 수 있다고 생각합니다. 목록을 간단하게 복사하는 간단한 방법은 단순히 list을 호출하는 것입니다. 시도 :

player_pos = list(area1.pos) 

과 :

old_pos = list(player_pos) 
관련 문제