Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表正在编辑所有值,而不是仅编辑一个值_Python_List_Python 3.x - Fatal编程技术网

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

Python 列表正在编辑所有值,而不是仅编辑一个值,python,list,python-3.x,Python,List,Python 3.x,这将打印,例如: 1(100100) 2(110100) 有人能给我解释一下为什么这个值在变化,我怎样才能防止它? 谢谢大家! 错误在于: 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

这将打印,例如:
1(100100)
2(110100)

有人能给我解释一下为什么这个值在变化,我怎样才能防止它? 谢谢大家!

错误在于:

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
这将
snake[1]
指定为与
snake[0]
相同的对象,而不是具有相同内容的对象副本

要制作对象的副本,请使用
snake[i-1][:]
list(snake[i-1])



您可能应该花一些时间考虑对象标识,因为它是python中可变对象的一个至关重要的部分。换言之,使用交互式shell和
id
函数进行游戏。

您可以使用元组代替@o11编写的(x,y)对,而不是列表。元组是不可变的,因此可以使用和分配元组,而不会产生不必要的副作用,这样就不容易出错。这将导致像这样的代码

snake[i] = snake[i - 1]
现在你不能写了

 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
的初始化。我怀疑您两次插入同一对象。如果有帮助,我添加了更多代码,请阅读:
 snake[i] = snake[i - 1]