Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在遍历列表后删除列表中一半的元素_Python_List_Python 2.7 - Fatal编程技术网

Python在遍历列表后删除列表中一半的元素

Python在遍历列表后删除列表中一半的元素,python,list,python-2.7,Python,List,Python 2.7,我完全被这个问题难住了: 我有以下python代码: def remove(self, widgets): for widget in widgets: widget_found = False for widget_sig in self.widgets: if widget_sig.id == widget: #remove all objects from selected widget

我完全被这个问题难住了:

我有以下python代码:

def remove(self, widgets):
    for widget in widgets:
        widget_found = False
        for widget_sig in self.widgets:
            if widget_sig.id == widget:
                #remove all objects from selected widget
                widget_found = True
                to_remove = widget_sig.objs
                for obj in to_remove:
                    #objs are all intances of oo_canvas classes
                    obj.destroy()
                    self._build(widget, obj)
        if not widget_found:
            #if we iterated through the entire list and still couldn't find anything
            raise mockingbird_errs.InternalMockingbirdError("The requested widget was not registered with this builder: "+str(widget))
这应该很直截了当。问题是,它永远不会通过迭代来正确删除。出于某种原因,它跳过了所有其他元素。更令人困惑的是,如果我让它在for循环前后打印要删除的长度,它会打印254和127。嗯?据我所知,遍历列表并不涉及删除所有其他元素

我是不是错过了一些简单的东西?到底发生了什么事

。。。它跳过所有其他元素

这是因为你不断删除它们,将列表缩短了1。然后继续下一个索引。要么向后工作,要么迭代列表的副本

。。。它跳过所有其他元素


这是因为你不断删除它们,将列表缩短了1。然后继续下一个索引。要么向后工作,要么迭代列表副本。

obj.destroy()在做什么???obj.destroy()将类中的一个属性从False更改为True。稍后,将在obj上调用另一个方法,该方法实际收集并使用数据。你在向我们隐瞒细节!如果确实要删除一半的
列表
(而不是只删除一个元素),通常最好只创建一个新的
列表
,其中包含要保留的元素。这并不是在所有情况下都有效(例如,如果其他人持有对同一
列表的引用,并且需要查看更改),但当它发生时,更容易推理,通常代码更简单,效率更高。我将很快澄清。我并没有试图删除一半的列表。我试图在不删除任何内容的情况下遍历整个列表。无论如何,我通过先复制列表解决了这个问题。obj.destroy()在做什么???obj.destroy()将类中的一个属性从False更改为True。稍后,将在obj上调用另一个方法,该方法实际收集并使用数据。你在向我们隐瞒细节!如果确实要删除一半的
列表
(而不是只删除一个元素),通常最好只创建一个新的
列表
,其中包含要保留的元素。这并不是在所有情况下都有效(例如,如果其他人持有对同一
列表的引用,并且需要查看更改),但当它发生时,更容易推理,通常代码更简单,效率更高。我将很快澄清。我并没有试图删除一半的列表。我试图在不删除任何内容的情况下遍历整个列表。不管怎样,我通过先复制列表解决了这个问题。我确实尝试了对副本进行迭代,这就解决了这个问题。谢谢。怎么做?我确实试着在副本上迭代,这就解决了问题。谢谢,怎么做?