1

我正在尝试制作一个游戏,我想在玩家移动之前保存玩家的位置(oldPosition),以便我以后可以使用它。问题是,当 World.UpdateContents() 运行时,oldPosition 与 self.position 一起更新。当 self.position 发生变化时,如何防止 oldPosition 发生变化?

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)
4

3 回答 3

1

该属性position是一个列表,当您将其分配给您时,oldPosition您正在创建对该列表的引用,但您所做的任何修改position也将反映在oldPosition- 它们指向同一个对象。position要解决此问题,请在开头复制一份,如下所示:

oldPosition = self.position[:]

现在oldPosition是一个新的、不同的列表,它不会受到对position.

于 2013-07-29T00:31:44.707 回答
0

你需要做 oldPosition = list(self.position),假设 self.position 是一个列表。这样,oldPosition 不仅是对 self.position 的引用,而且是一个具有相同值的新列表。

于 2013-07-29T00:36:19.663 回答
0

奥斯卡·洛佩兹是对的,他的解决方案会奏效。您面临的问题是由于 python 中的列表是可变的。这是什么意思?

好吧,假设我们有一些不可变的变量,例如整数。我们可以说,

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

正如预期的那样,它返回:

x = 4 y = 3

发生这种情况是因为“y = x”行在变量 y 内创建了整数 x 的副本。我们现在可以对 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 时,python 不是在 y 中创建 x 的副本,而是让 y 指向 x 指向的相同数据。因此,当我们更改 x 时,y 似乎也随之发生了神奇的变化,这是有道理的,因为变量 y 指的是 x 所做的同一件事。x 和 y 与列表和字典等可变类型之间的联系持续到“y = x”这一行之外。

为了抵消这一点, y = x[:] 有效,这与做

y = [] # y is a brand new list!
for elem in x:
    y.append(elem)
于 2013-07-29T02:40:47.327 回答