亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

對精靈子彈組對象進行更新,為什么是對副本進行遍歷?

# 在《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
  • 參與學習       758382    人
  • 解答問題       8967    個

學python入門視頻教程,讓你快速入門并能編寫簡單的Python程序

進入課程

對精靈子彈組對象進行更新,為什么是對副本進行遍歷?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號