关于 for 循环对列表元素删除操作的问题。

感谢各位点进来。
目标希望用方法对列表中某符合条件的对象进行删除操作,
以下两种for循环中,对下标进行循环的for循环可以成功删除,但对列表中元素进行循环则无法成功删除。
希望论坛各位不吝赐教,谢谢!

class Enemy:
    def __init__(self, name, health, attack, defence):
        self.name = name
        self.health = health
        self.attack = attack
        self.defence = defence

list_enemies = [
  Enemy("灭霸", 0, 0, 0),
  Enemy("灭灭", 10, 10, 10),
  Enemy("霸霸", 1000, 1000, 1000),
  Enemy("霸灭", 10000, 10000, 10000)
]

删除列表数据中,最后一个数字参数 < 10 的数据\

def del04():

为什么这种for循环无法删除掉数据

 global list_enemies
   list_enemies_copy = list_enemies[::-1]
   for item in list_enemies_copy:
        if item.defence < 10:
            del item\
    list_enemies = list_enemies_copy[::-1]

而这种for循环却可以删除掉呢?

  for i in range(-1, -len(list_enemies)-1, -1):
        if list_enemies[i].defence < 10:
            del list_enemies[i]

del04()
for item_result in list_enemies:
    print(item_result.name)
讨论数量: 3

item是被list_enemies当前指针元素赋值的变量,而不是list_enemies当前指针所对应的元素。 简单点说,遍历就是不停的把自己的元素,按顺序,赋值给一个临时的item变量。 所以你del list_enemies[i]是删除列表本身的某个元素,而del item只是删除那个临时变量。

4年前 评论

同意楼上的观点。我换一种表述,当使用遍历时,被遍历的对象的被引用次数为2 ~ 列表引用一次,当前遍历变量 item 引用一次,此时使用 del item 只会删除变量 item,被遍历的对象的被引用的次数为 1,所以该对象不会被垃圾回收机制回收;而使用下标遍历时,del list_enemies[i] 删除了对应的 Enemy 对象唯一的引用,所以该对象被系统的垃圾回收机制回收,对象被删除。
当然,个人更习惯于使用列表解析式的方式实现列表筛选的功能:

>>> list_enemies = [item for item in list_enemies if item.defence >= 10]
>>> print([item.name for item in list_enemies])
['灭灭', '霸霸', '霸灭']
4年前 评论
Jason990420

Python behind the scenes creates an iterator for your list, and it is the iterator which moves through your list one entry at a time. The iterator is evaluated once, which means that if you then modify your list, the iterator could potentially get 'lost' - you also can't use the x variable to modify your list, since it is just a reference to the thing in your list.

你的list会在运行中一直被参考, 如果你改了这个list, 迭代器很可能会丢失, 你也不可以使用个指针变量来修改你的list, 因为那个指针变量也是参考着那个list. 换个函数来改变list的参考, 问题就可以解决了, 比如.range(-1, -len(list_enemies)-1, -1), len(my_list), ....... 这已经不是那个你想修改的list了.

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!