我正在制作一个基本的Snake游戏并遇到了这个问题。我完全傻到为什么会发生这种情况,这是代码。
self._body就像数组一样:
[[15, 20], [16, 20], [17, 20]]
此代码的目标是将其转换为:
[[14, 20], [15, 20], [16, 20]]
似乎很简单吧?这是问题代码,请注意打印语句的位置:
if move == 'w' or move == 'W' :
print(self._body)
for i in range(len(self._body)-1,0,-1):
self._body[i] = self._body[i-1]
print(self._body)
self._body[0][0] -= 1
print(self._body)
此代码的输出为:
[[15, 20], [16, 20], [17, 20]]
[[15, 20], [15, 20], [16, 20]]
[[14, 20], [14, 20], [16, 20]]
直到最后一次陈述才正确。
由于某种原因,
self._body[0][0] -= 1
改变两者
self._body[0][0]
和
self._body[1][0]
我不能为我的生活找出原因。即使我可以解决,我仍然真的想知道为什么会这样。
非常感谢你!
答案 0 :(得分:1)
问题在于:
self._body[i] = self._body[i-1]
这将不制作右侧列表的副本。它会将完全相同的列表对象分配给这两个变量。因此,如果您更改一个,则更改另一个。您需要复制列表,如下所示:
self._body[i] = list(self._body[i-1])
这使很多人绊倒了。请记住,您必须明确复制列表。