2013-07-29 3 views
1

Я пытаюсь создать игру, и я хочу сохранить позицию игрока до его перемещения (oldPosition), чтобы впоследствии использовать его. Проблема в том, что к моменту запуска World.UpdateContents() oldPosition обновляется вместе с self.position. Как я могу сохранить oldPosition от изменения, когда self.position делает?Пытается сохранить переменную класса для последующего использования

def Move(self, direction): 
    oldPosition = self.position 
    print oldPosition 
    if direction == "Up": 
     if self.position[0] - 1 in World.worldMap[0]: 
      self.position[0] -= 1 
    if direction == "Down": 
     if self.position[0] + 1 in World.worldMap[0]: 
      self.position[0] += 1 
    if direction == "Left": 
     if self.position[1] - 1 in World.worldMap[1]: 
      self.position[1] -= 1 
    if direction == "Right": 
     if self.position[1] + 1 in World.worldMap[1]: 
      self.position[1] += 1 
    print oldPosition 
    World.UpdateContents(world, oldPosition, self.position, self.icon) 

ответ

1

position Атрибут представляет собой список, когда вы назначаете его oldPosition вы создаете ссылку на этот список, но любые изменения вы делаете на position также будут отражены на oldPosition - они указывают на тот же объект. Чтобы решить эту проблему, сделайте копию position в начале, как это:

oldPosition = self.position[:] 

Теперь oldPosition новый, отличный список, и он не будет зависеть от изменений, внесенных в position.

+0

Спасибо! Я не думал, что это будет так просто. – wipeout4wh

0

вам нужно сделать oldPosition = list (self.position), считая, что self.position - это список. Таким образом, oldPosition - это не только ссылка на self.position, но и новый список с одинаковыми значениями.

0

Оскар Лопес прав, и его решение будет работать. Проблема, с которой вы столкнулись, связана с тем, что списки в python изменяемы. Что это значит?

Ну, скажем, у нас есть некоторая изменяемая переменная, такая как целое число. Мы можем сделать, скажем,

x = 3 
y = x 
x = x + 1 
print "x =", x, "y =", y 

, который, как и ожидалось, возвращает:

x = 4 y = 3 

Это происходит потому, что линия «у = х» создает копию целочисленного х внутри переменной у. Мы можем делать то, что мы хотим теперь, чтобы x и y не волновало, потому что оно не привязано к переменной x после ее объявления.

Если мы выполняем аналогичные операции с списками, мы получаем разные результаты.

x = [1,2,3] 
y = x 
x.append(4) 
print "x =", x, "y =", y 

возвращения

x = [1,2,3,4] y = [1,2,3,4] 

Так что произошло? Поскольку списки изменяемы, когда мы позволяем y равным x здесь, вместо создания копии x в y, python делает y указывать на те же данные, на которые указывает x. Итак, когда мы меняем x, y, похоже, волшебным образом изменяется вместе с ним, что имеет смысл, поскольку переменная y относится к той же вещи, что и x. Связь между x и y с изменяемыми типами, такими как списки и словари, длится за пределами строки «y = x».

Чтобы противодействовать этому, у = х [:] работы, которые, по существу, такой же, как делает

y = [] # y is a brand new list! 
for elem in x: 
    y.append(elem) 
Смежные вопросы