将变量值插入列表-Python

时间:2019-09-15 15:18:43

标签: python pygame

我正在开发一个Snake游戏,而Tail确实遇到了麻烦。我创建的代码应该可以使用,但是列表和我使用的变量存在一些问题。

在程序开始时,我声明了2个列表:

playerpos=[552,352]
snake=[]

当我移动蛇时,playerpos会增加或减少50。 然后,将列表“ playerpos”插入列表“ snake

”的位置0
snake.insert(0,playerpos)

我打印蛇头

screen.blit(serpente,snake[0])
pygame.display.flip #upgrade the screen

程序的其余部分:

    if prevscore==score:
        del snake[0]
    elif prevscore<score:
        prevscore+=1
    for i in range(0,score):
        screen.blit(tail,snake[i])
    pygame.display.flip()

现在,我使用此代码来查看蛇是否吃了一个苹果。 如果他做到了,我什么也不会做。如果他没有,我只是删除列表的第一个元素(以保持蛇的长度相同)

然后,我开始进行“ for cycle”打印蛇尾。

我希望它出现在尾巴上,但不是。我调试了程序,发现当我更改“ playerpos”的值时,所有“ snake”列表都会改变。 看起来不是

snake=[[value took from playerpos] , [value took from playerpos] , [value took from playerpos]]

但更像是

snake=[playerpos, playerpos, playerpos]

因此,当我更改playerpos值以移动蛇时,整个蛇列表都会更改

1 个答案:

答案 0 :(得分:1)

playerpos=[552,352]是一个列表。您必须创建玩家位置的浅表副本:

snake.insert(0, playerpos[:])

注意,在python中,变量名是对对象的引用。数据包含在对象中。进行分配时,将分配引用,并且两个变量都引用同一对象。

这样做的时候

  
snake.insert(0, playerpos)

然后将名称playerpos后面的对象的引用插入到列表中。最后,列表的所有元素都引用同一对象。因此,如果您更改playerpos的内容,那么所有元素似乎也都发生了神奇的变化。

[:]创建一个list的浅表副本。因此,将插入对列表副本(playerpos)的引用。