第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 21:11 编辑
ls =
for i in range(len(ls)):
print(ls)
ls.remove(ls)
最后打印出来只有1,3,列表的size被改变了,这在遍历的时候很危险,很容易out of range jkluoling1992 发表于 2020-5-8 20:41
最后打印出来只有1,3,列表的size被改变了,这在遍历的时候很危险,很容易out of range
不可能 out of range,但是可能会有元素被跳过 永恒的蓝色梦想 发表于 2020-5-8 20:46
不可能 out of range,但是可能会有元素被跳过
我写的这个不会,,但是存在这种危险,跳过元素只是逻辑错误,越界就是crash 了 jkluoling1992 发表于 2020-5-8 20:51
我写的这个不会,,但是存在这种危险,跳过元素只是逻辑错误,越界就是crash 了
for i in 列表永远不可能越界。 永恒的蓝色梦想 发表于 2020-5-8 20:55
for i in 列表永远不可能越界。
l =
ls =
for i in l:
print(i)
print(ls)
l.remove(i)
越不越界,跟for i in 列表没关系,跟里面写的内容有关 jkluoling1992 发表于 2020-5-8 21:16
l =
ls =
for i in l:
……你要是这么用for in 的话,我只能说天秀 永恒的蓝色梦想 发表于 2020-5-8 21:17
……你要是这么用for in 的话,我只能说天秀
越不越界本来就跟 for i in 列表没关系啊,而且我说的是很容易out of range,并不是一定,,只是针对你说的永远不可能,,,写了一个可能的情况 jkluoling1992 发表于 2020-5-8 21:21
越不越界本来就跟 for i in 列表没关系啊,而且我说的是很容易out of range,并不是一定,,只是针对你说 ...
这种情况和 for in 有关系吗?这难道不是自己造的错误? 永恒的蓝色梦想 发表于 2020-5-8 21:22
这种情况和 for in 有关系吗?这难道不是自己造的错误?
是没关系,,那你再回头看看 for i in 列表不可能越界,这句话也是不严谨的啊,明白你的意思,for i in列表,遍历该列表不会越界,for语句里不一定只遍历一个list啊
很多bug都是自己造的,,只不过刚刚写的那个太明显了,,,举个例子,,
jkluoling1992 发表于 2020-5-8 21:25
是没关系,,那你再回头看看 for i in 列表不可能越界,这句话也是不严谨的啊,明白你的意思,for i in列 ...
只有在 in 后面的才算是被遍历的吧{:10_327:} 永恒的蓝色梦想 发表于 2020-5-8 21:27
只有在 in 后面的才算是被遍历的吧
是的 jkluoling1992 发表于 2020-5-8 21:32
是的
for语句里不一定只遍历一个list啊你说的是不是错了呢? jkluoling1992 发表于 2020-5-8 20:41
最后打印出来只有1,3,列表的size被改变了,这在遍历的时候很危险,很容易out of range
你举的这个例子,如果选用小甲鱼说的先复制的方式,仍然是报错的,我不理解先复制列表的优点在哪
ls =
for i in range(len(ls[:])):
print(ls)
ls.remove(ls) 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]