关于 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)
关于 LearnKu
item是被list_enemies当前指针元素赋值的变量,而不是list_enemies当前指针所对应的元素。 简单点说,遍历就是不停的把自己的元素,按顺序,赋值给一个临时的item变量。 所以你del list_enemies[i]是删除列表本身的某个元素,而del item只是删除那个临时变量。
同意楼上的观点。我换一种表述,当使用遍历时,被遍历的对象的被引用次数为2 ~ 列表引用一次,当前遍历变量
item引用一次,此时使用del item只会删除变量item,被遍历的对象的被引用的次数为 1,所以该对象不会被垃圾回收机制回收;而使用下标遍历时,del list_enemies[i]删除了对应的Enemy对象唯一的引用,所以该对象被系统的垃圾回收机制回收,对象被删除。当然,个人更习惯于使用列表解析式的方式实现列表筛选的功能:
你的list会在运行中一直被参考, 如果你改了这个list, 迭代器很可能会丢失, 你也不可以使用个指针变量来修改你的list, 因为那个指针变量也是参考着那个list. 换个函数来改变list的参考, 问题就可以解决了, 比如.range(-1, -len(list_enemies)-1, -1), len(my_list), ....... 这已经不是那个你想修改的list了.