對精靈子彈組對象進行更新,為什么是對副本進行遍歷?
# 在《python編程:從入門到實踐》中的“外星人入侵”的游戲項目中,函數功能模塊中有個更新子彈精靈組的代碼塊。如下:
def update_bullets(bullets):
#更新子彈群組的位置,并刪除已消失的子彈
????bullets.update()
# 為什么要在copy中遍歷呢 ?
????for bullet in bullets.copy():
????????if bullet.rect.bottom < 0:
????????????bullets.remove(bullet)
2020-01-28
好像有點感覺了,循環、刪除時,是按照位置執行的: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)的中的所有元素。
2018-10-23
這是因為在循環lists,并刪除lists的元素時,列表的位置發生了移位,比如刪除列表[1,2,3,4,5],當刪除“1”后,第二個元素“2”補位,"2"跑到了“1”的位置,原先“2”位置上沒有了,這樣“2”就躲過了被刪除的命運,輪到“3”了,“3”被刪除之后,“4”來補位,逃過一劫,以此類推??!
所以解決方式是用副本遍歷,這樣遍歷的副本是不變的,和刪除的列表沒有任何關系。。。。。
2018-04-21
請告訴我,我也想知道這個問題