关于 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)
讨论数量: 2

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

1个月前 评论

同意楼上的观点。我换一种表述,当使用遍历时,被遍历的对象的被引用次数为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])
['灭灭', '霸霸', '霸灭']
3周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

官方入门教程,从这里开始你的 Python 之旅,将长久维护
《A Byte of Python》的中文译本,由社区维护,每年更新
Python 日常使用的最佳实践,高级 Python 开发者必知必会的知识
Pymotw.com 的中文翻译,实例讲解 Python 3 标准库,简单易懂