当我从开始到停止迭代list1的值时,如:
for value in list1[start:stop]: ....
python是否首先复制列表的那一部分(就像在执行list2 = list1 [:]时那样)?对于大型列表,这可能会变得非常昂贵!
如果它没有在上面的例子中复制它,那总是适用吗?我需要经常在(非常)大型列表的大部分上执行以下类型的循环:
for index,value in enumerate(list1[start:stop],start): ....
解决方法
list1 [start:stop]创建一个新列表,句点.总是如此,无论您是直接迭代结果还是在其间使用函数或在任何其他上下文中使用它(您需要适度静态语言或复杂类型推断,以便优化甚至简单第一种情况的实例).
请注意,这与迭代无关!迭代本身不会复制,即使您将结果丢弃,列表也会复制.
它只复制指针,所以如果你总是采用非常小的子列表,你可能不会注意到任何差异.如果子列表较大,您可以迭代索引([x]范围)或使用itertools.islice.后者必须首先跳过启动项目,因此您可能需要花费大量时间才能节省内存.前者是丑陋的,但大多数都是无意义的.