11tadpole 发表于 2020-5-8 20:05:02

第37讲类和对象作业,乌龟吃鱼的疑问

在看下面代码的时候,小甲鱼特别强调要先复制列表,但我感觉没有差别,删除列表中的元素后,复制版里的元素也少了,有谁可以举个例子,解释一下吗?
pos = turtle.move()
    # 在迭代器中删除列表元素是非常危险的,经常会出现意想不到的问题,因为迭代器是直接引用列表的数据进行引用
    # 这里我们把列表拷贝给迭代器,然后对原列表进行删除操作就不会有问题了^_^
    for each_fish in fish[:]:
      if each_fish.move() == pos:
            # 鱼儿被吃掉了
            turtle.eat()
            fish.remove(each_fish)
            print("有一条鱼儿被吃掉了...")

jkluoling1992 发表于 2020-5-8 20:41:39

本帖最后由 jkluoling1992 于 2020-5-8 21:11 编辑

ls =

for i in range(len(ls)):
   print(ls)
   ls.remove(ls)
最后打印出来只有1,3,列表的size被改变了,这在遍历的时候很危险,很容易out of range

永恒的蓝色梦想 发表于 2020-5-8 20:46:27

jkluoling1992 发表于 2020-5-8 20:41
最后打印出来只有1,3,列表的size被改变了,这在遍历的时候很危险,很容易out of range

不可能 out of range,但是可能会有元素被跳过

jkluoling1992 发表于 2020-5-8 20:51:59

永恒的蓝色梦想 发表于 2020-5-8 20:46
不可能 out of range,但是可能会有元素被跳过

我写的这个不会,,但是存在这种危险,跳过元素只是逻辑错误,越界就是crash 了

永恒的蓝色梦想 发表于 2020-5-8 20:55:35

jkluoling1992 发表于 2020-5-8 20:51
我写的这个不会,,但是存在这种危险,跳过元素只是逻辑错误,越界就是crash 了

for i in 列表永远不可能越界。

jkluoling1992 发表于 2020-5-8 21:16:24

永恒的蓝色梦想 发表于 2020-5-8 20:55
for i in 列表永远不可能越界。

l =
ls =
for i in l:
    print(i)
    print(ls)
    l.remove(i)
越不越界,跟for i in 列表没关系,跟里面写的内容有关

永恒的蓝色梦想 发表于 2020-5-8 21:17:42

jkluoling1992 发表于 2020-5-8 21:16
l =
ls =
for i in l:


……你要是这么用for in 的话,我只能说天秀

jkluoling1992 发表于 2020-5-8 21:21:13

永恒的蓝色梦想 发表于 2020-5-8 21:17
……你要是这么用for in 的话,我只能说天秀

越不越界本来就跟 for i in 列表没关系啊,而且我说的是很容易out of range,并不是一定,,只是针对你说的永远不可能,,,写了一个可能的情况

永恒的蓝色梦想 发表于 2020-5-8 21:22:09

jkluoling1992 发表于 2020-5-8 21:21
越不越界本来就跟 for i in 列表没关系啊,而且我说的是很容易out of range,并不是一定,,只是针对你说 ...

这种情况和 for in 有关系吗?这难道不是自己造的错误?

jkluoling1992 发表于 2020-5-8 21:25:38

永恒的蓝色梦想 发表于 2020-5-8 21:22
这种情况和 for in 有关系吗?这难道不是自己造的错误?

是没关系,,那你再回头看看 for i in 列表不可能越界,这句话也是不严谨的啊,明白你的意思,for i in列表,遍历该列表不会越界,for语句里不一定只遍历一个list啊
很多bug都是自己造的,,只不过刚刚写的那个太明显了,,,举个例子,,

永恒的蓝色梦想 发表于 2020-5-8 21:27:54

jkluoling1992 发表于 2020-5-8 21:25
是没关系,,那你再回头看看 for i in 列表不可能越界,这句话也是不严谨的啊,明白你的意思,for i in列 ...

只有在 in 后面的才算是被遍历的吧{:10_327:}

jkluoling1992 发表于 2020-5-8 21:32:36

永恒的蓝色梦想 发表于 2020-5-8 21:27
只有在 in 后面的才算是被遍历的吧

是的

永恒的蓝色梦想 发表于 2020-5-8 21:33:47

jkluoling1992 发表于 2020-5-8 21:32
是的

for语句里不一定只遍历一个list啊你说的是不是错了呢?

11tadpole 发表于 2020-5-9 20:31:06

jkluoling1992 发表于 2020-5-8 20:41
最后打印出来只有1,3,列表的size被改变了,这在遍历的时候很危险,很容易out of range

你举的这个例子,如果选用小甲鱼说的先复制的方式,仍然是报错的,我不理解先复制列表的优点在哪
ls =

for i in range(len(ls[:])):
   print(ls)
   ls.remove(ls)

jkluoling1992 发表于 2020-5-9 22:43:16

11tadpole 发表于 2020-5-9 20:31
你举的这个例子,如果选用小甲鱼说的先复制的方式,仍然是报错的,我不理解先复制列表的优点在哪

l =
print("复制:")
for i in l[:]:
    print(i)
    l.remove(i)
print("不复制:")
ls =
for i in ls:
    print(i)
    ls.remove(i)


运行一下看看,对比区别啊,,先复制列表(就是切片操作),这样可以每个都遍历,若用原列表的话,元素会缺失,这是最明显的一个问题,当然还会出现别的问题,总之很危险的行为
页: [1]
查看完整版本: 第37讲类和对象作业,乌龟吃鱼的疑问