番茄游戏中 发表于 2021-10-14 11:18:06

第37讲作业中的龟吃鱼问题有个疑问

原贴地址:https://fishc.com.cn/thread-48620-1-2.html
下面是我有疑问的代码:


while True:
    if not len(fish):
      print("鱼儿都吃完了,游戏结束!")
      break
    if not turtle.power:
      print("乌龟体力耗尽,挂掉了!")
      break

    pos = turtle.move()
    # 在迭代器中删除列表元素是非常危险的,经常会出现意想不到的问题,因为迭代器是直接引用列表的数据进行引用
    # 这里我们把列表拷贝给迭代器,然后对原列表进行删除操作就不会有问题了^_^
    for each_fish in fish[:]:
      if each_fish.move() == pos:
            # 鱼儿被吃掉了
            turtle.eat()
            fish.remove(each_fish)
            print("有一条鱼儿被吃掉了...")


这一部分将列表拷贝给迭代器是不是会出现另外一种问题,就是已经吃掉的鱼在迭代器(fish[:])中还是存在的,这样的话,因为随机移动,吃掉的鱼在龟附近,所以会更容易随机再一次被判断为被龟吃掉。但是这个鱼已经被从fish列表中被移除了,这时候会不会出现报错?因为我运行的时候没有报错,但不确定是不是自己没有考虑理解全面。

tianlai7266 发表于 2021-10-19 10:35:54

{:10_256:}

无尽紫心 发表于 2021-10-24 21:32:25

sunyt 发表于 2021-12-7 18:06:29

这是对fish进行操作的吧,fish[:]代表的是fish数组从开头到结尾,这个数组是可以更改的,for里面的修改会影响到fish[:]。
页: [1]
查看完整版本: 第37讲作业中的龟吃鱼问题有个疑问