python 37课后 乌龟吃鱼 迭代删除列表元素
这个程序最后 两行注释 # 在迭代器中删除列表元素是非常危险的,经常会出现意想不到的问题,因为迭代器是直接引用列表的数据进行引用# 这里我们把列表拷贝给迭代器,然后对原列表进行删除操作就不会有问题了
这两行不懂 自己试了一下加[:]和不加[:] 为什么不同
程序一部分:
turtle = Turtle()
fish = []
for i in range(10):
new_fish = Fish()
fish.append(new_fish)
while True:
if not len(fish):
print("鱼儿都吃完了,游戏结束!")
break
if not turtle.power:
print("乌龟体力耗尽,挂掉了!")
breakz
pos = turtle.move()
# 在迭代器中删除列表元素是非常危险的,经常会出现意想不到的问题,因为迭代器是直接引用列表的数据进行引用
# 这里我们把列表拷贝给迭代器,然后对原列表进行删除操作就不会有问题了^_^
for each_fish in fish[:]:
if each_fish.move() == pos:
# 鱼儿被吃掉了
turtle.eat()
fish.remove(each_fish)
print("有一条鱼儿被吃掉了...")
加了 : 是复制了一份新的 lst 是数组,是其中一种容器(可迭代/ iterable)。通常不会在迭代的过程删除元素,原因如下。
for each in range(10): #你自己写的话要怎么实现?应该是固定一个量 N,然后让 i += 1。每一次比较。当然,你也可以动态调整 N。
问题来了。你的数组有 4 个元素,一开始下标为 0,被你删除了,数组往前移动,下标原本为 1 的,现在变成 0 了。然后 i += 1。现在,你索引 lst,却是指向原本本 lst。跳了一格。删除、跳一格、到达数组尾端,退出。
for each in lst[:]: 不一样,因为 each = lst[:],也就是 each 是 lst 的所有元素。你那个循环只执行一次,直接把所有的元素删除。 claws0n 发表于 2018-9-6 16:20
lst 是数组,是其中一种容器(可迭代/ iterable)。通常不会在迭代的过程删除元素,原因如下。
for each ...
哦哦 懂了为什么会跳着删除但是为什么 each=lst[:]? HISIOISIH 发表于 2018-9-6 17:23
哦哦 懂了为什么会跳着删除但是为什么 each=lst[:]?
楼上说了。这个跟数据结构有关系,虽然他叫”数组“,但实际上它是一个双向链表。不管怎样,当你删除了一个元素后,后一个元素的前面是不是有空格?有空格就会往前移。现在删除第一个元素,原本第二个元素等(包括后面的所有元素)往前移动。现在计数器跑去第二个位置,是不是数到原本第三个元素?
指针V |指针加一 V
原本0 1 2 3 4... | 1 2 3 4 ....
删 1 2 3 4 .... | 1 3 4 ...
claws0n 发表于 2018-9-6 17:45
楼上说了。这个跟数据结构有关系,虽然他叫”数组“,但实际上它是一个双向链表。不管怎样,当你删除了一 ...
哦哦 lst[:]就是复制一个新的 但被删的不是他 HISIOISIH 发表于 2018-9-6 19:29
哦哦 lst[:]就是复制一个新的 但被删的不是他
对,因为复制了,内容一模一样,删除的时候直接把所有内容给删除了
页:
[1]