我正在尝试使用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
应该完全相同。为什么这不起作用?
答案 0 :(得分:2)
他们在任何时候都不是完全相同的意思。当您执行position = [x, y]
时,您将位置设置为等于x
和y
此时值的列表。 position
没有"自动更新" x
更改后的值(反之亦然)。如果您更改position[0]
,则还需要自己更改x
(反之亦然),否则两者将不同步。
答案 1 :(得分:2)
您遇到的问题是因为Python中的整数是不可变的。与可以使用+=
等运算符就地更改的其他对象(例如列表)不同,int
实例永远不能从其当前值更改。当你执行类似x += 1
(其中x
是int
)的操作时,你真的得到x = x + 1
,它会创建一个带有和的结果的新整数对象,然后重新绑定x
新值。
在代码中,当您执行position = [x, y]
时,您会创建一个列表,其中包含两个也与变量x
和y
绑定的整数。但是,当您执行position[0] += velocity[0]
时,x
和position[0]
之间的身份会中断。处理不可变对象时,该语句等同于position[0] = position[0] + velocity[0]
,它创建一个新值并将其存储在列表中,替换x
。名称x
仍然与之前的值绑定,后者保持不变。
答案 2 :(得分:1)
这是因为您使用值x
和y
来绘制块,而不是position[0]
或position[1]
。当您更新position
值时,变量x
和y
保持不变(请参阅您的代码)。因此,暂时position
在您的程序中没有任何用途,除了它将x和y值分组。