snake = []
snake_size = 10
snake.append([display_width / 2, display_height / 2])
snake_dx = 10
snake_dy = 0
#I then declare some more lists in snake in an identical fashion
for i in range(len(snake) - 1, 0, -1):
snake[i] = snake[i - 1]
try:
print('1', snake[1])
except:
pass
snake[0][0] += snake_dx
snake[0][1] += snake_dy
try:
print('2', snake[1])
except:
pass
这将打印,例如:
1(100,100)
2(110,100)
有人可以向我解释为什么这个价值正在发生变化以及如何阻止它? 谢谢!
答案 0 :(得分:2)
错误就是这一行:
snake[i] = snake[i - 1]
这会将snake[1]
指定为与snake[0]
相同的对象,而不是指定具有相同内容的对象的副本。
要制作对象的副本,请使用snake[i - 1][:]
或list(snake[i - 1])
。
你应该花一些时间考虑对象身份,因为它是python中可变对象的一个至关重要的部分。换句话说,使用交互式shell和id
函数。
答案 1 :(得分:2)
而不是@ o11所写的内容,你可以使用元组来代替列表(x,y)。元组是不可变的,因此可以使用和分配它们而不会产生不必要的副作用,这更不容易出错。这将导致像
这样的代码 snake.append((display_width / 2, display_height / 2))
现在你不能写
snake[0][0] += snake_dx
snake[0][1] += snake_dy
任何更多(这会给你一个运行时错误)。相反,你必须用
替换这两行 snake[0] = (snake[0][0] + snake_dx, snake[0][1] + snake_dy)
该行
snake[i] = snake[i - 1]
不需要修改。