试图为以后的我们存储一个类变量

2024-05-20 22:43:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个游戏,我想在玩家移动之前保存他的位置(旧位置),以便以后使用。问题是到那时World.Update内容()运行,旧位置随自我定位. 我怎样才能不改变原来的位置自我定位做?你知道吗

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)

Tags: in定位self游戏内容worldifdef
3条回答

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

oldPosition = self.position[:]

现在oldPosition是一个新的、不同的列表,它不会受到对position所做更改的影响。你知道吗

您需要执行oldPosition=list(自我定位),假设自我定位是一个列表。这样,oldPosition就不仅仅是对自我定位但是一个新的列表具有相同的值。你知道吗

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

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

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

正如预期的那样,它的回报是:

x = 4 y = 3

这是因为行“y=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)

相关问题 更多 >