为什么列表中的变量不像我期望的那样?

时间:2014-08-01 05:11:14

标签: python pygame

我正在尝试使用pygame在Python中制作一个简单的动画,其中一个块在屏幕上移动。我包括(我认为是)代码的相关部分。

x, y = 1, 1

while True:

    rwidth, rheight = 10, 10
    left, top = x - (rwidth / 2), y - (rheight / 2)

    myRect = left, top, rwidth, rheight
    pygame.draw.rect(screen, white, myRect)

    position = [x, y]
    velocity = [5, 5]

    position[0] += velocity[0]

正在发生的是块出现在它应该的位置,但它不会移动。但是,如果我将position[0] += velocity[0]替换为x += velocity[0],它就会完全符合我的要求。据我所知,position[0]x应该完全相同。为什么这不起作用?

3 个答案:

答案 0 :(得分:2)

他们在任何时候都不是完全相同的意思。当您执行position = [x, y]时,您将位置设置为等于xy此时的列表。 position没有"自动更新" x更改后的值(反之亦然)。如果您更改position[0],则还需要自己更改x(反之亦然),否则两者将不同步。

答案 1 :(得分:2)

您遇到的问题是因为Python中的整数是不可变的。与可以使用+=等运算符就地更改的其他对象(例如列表)不同,int实例永远不能从其当前值更改。当你执行类似x += 1(其中xint)的操作时,你真的得到x = x + 1,它会创建一个带有和的结果的新整数对象,然后重新绑定x新值。

在代码中,当您执行position = [x, y]时,您会创建一个列表,其中包含两个也与变量xy绑定的整数。但是,当您执行position[0] += velocity[0]时,xposition[0]之间的身份会中断。处理不可变对象时,该语句等同于position[0] = position[0] + velocity[0],它创建一个新值并将其存储在列表中,替换x。名称x仍然与之前的值绑定,后者保持不变。

答案 2 :(得分:1)

这是因为您使用值xy来绘制块,而不是position[0]position[1]。当您更新position值时,变量xy保持不变(请参阅您的代码)。因此,暂时position在您的程序中没有任何用途,除了它将x和y值分组。