列表正在编辑所有值而不是仅编辑一个值

时间:2015-06-26 04:06:33

标签: python list python-3.x

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)

有人可以向我解释为什么这个价值正在发生变化以及如何阻止它? 谢谢!

2 个答案:

答案 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]

不需要修改。