为了账号安全,请及时绑定邮箱和手机立即绑定

对精灵子弹组对象进行更新,为什么是对副本进行遍历?

# 在《python编程:从入门到实践》中的“外星人入侵”的游戏项目中,函数功能模块中有个更新子弹精灵组的代码块。如下:

def update_bullets(bullets):

#更新子弹群组的位置,并删除已消失的子弹

    bullets.update()

# 为什么要在copy中遍历呢 ?

    for bullet in bullets.copy():

        if bullet.rect.bottom < 0:

            bullets.remove(bullet)


正在回答

3 回答

好像有点感觉了,循环、删除时,是按照位置执行的:1-5 逐个执行。先处理第一个位置,然后处理第二个位置,依次类推。如果循环bullets,删除1 后,2 补位到 1 的位置,那2 原来的位置现在是空的,那就不会循环2,也不会删除 2 了,最后只会删除1、3、5, 2、4 补位了,所以没删除。

循环副本时,先删除 bullets 中 的 1 ,2 前移到 1 的位置;因为bullets.copy中 的 1 没有删除,2 不会前移,所以第二次循环 bullets.copy 中的第二个元素:2;之后是循环 第三个元素:3, 依次类推,这样就避免了上面的问题。虽然bullets中的元素被删除了,但是bullets.copy的元素并没有改动,所以会循环到bullets(=bullets.copy)的中的所有元素。

1 回复 有任何疑惑可以回复我~

这是因为在循环lists,并删除lists的元素时,列表的位置发生了移位,比如删除列表[1,2,3,4,5],当删除“1”后,第二个元素“2”补位,"2"跑到了“1”的位置,原先“2”位置上没有了,这样“2”就躲过了被删除的命运,轮到“3”了,“3”被删除之后,“4”来补位,逃过一劫,以此类推!!

所以解决方式是用副本遍历,这样遍历的副本是不变的,和删除的列表没有任何关系。。。。。


2 回复 有任何疑惑可以回复我~

请告诉我,我也想知道这个问题

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
初识Python
  • 参与学习       758620    人
  • 解答问题       8667    个

学python入门视频教程,让你快速入门并能编写简单的Python程序

进入课程

对精灵子弹组对象进行更新,为什么是对副本进行遍历?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信