Python:通过'list [a:b]'的迭代是否首先复制列表的那部分(这可能很昂贵)?

Jef*_*eff 6 python

当我走过的迭代值list1startstop,如:

for value in list1[start:stop]:
    ....
Run Code Online (Sandbox Code Playgroud)

python是否首先复制列表的那一部分(就像在做的时候那样list2 = list1[:])?对于大型列表,这可能会变得非常昂贵!

如果它没有在上面的例子中复制它,那总是适用吗?我需要经常在(非常)大型列表的大部分上执行以下类型的循环:

for index, value in enumerate(list1[start:stop], start):
    ....
Run Code Online (Sandbox Code Playgroud)

小智 8

list1[start:stop]创建一个新列表,句点.总是如此,无论您是直接迭代结果还是在其间使用函数或在任何其他上下文中使用它(您需要适度静态语言或复杂类型推断,以便优化甚至简单第一种情况的实例).

请注意,这与迭代无关!迭代本身不会复制,即使您将结果丢弃,列表也会复制.

它只复制指针,所以如果你总是采用非常小的子列表,你可能不会注意到任何差异.如果子列表较大,您可以迭代indices([x]range)或使用itertools.islice.后者必须首先跳过start项目,所以你可能需要花费大量的时间来节省内存.前者是丑陋的,但大多数efficent asymptomically.