3

我是 python 的新手,在我读到关于列表方法的所有地方我都看到一件事

slice 方法返回一个“新”列表

这里的“新”列表是什么意思,为什么它比更改原始列表更快?

如果python操纵原始列表真的很重要吗,我的意思是我无论如何都不能使用它。

4

4 回答 4

3

使用列表,您可以同时执行以下操作:

1)创建一个新列表(原样保持不变):

In [1]: l = [1, 2, 3, 4, 5]

In [2]: l[:3]
Out[2]: [1, 2, 3]

In [3]: l
Out[3]: [1, 2, 3, 4, 5]

2)就地修改列表:

In [6]: del l[3:]

In [7]: l
Out[7]: [1, 2, 3]

In [8]: l.append(15)

In [9]: l
Out[9]: [1, 2, 3, 15]

您可以选择哪种方式对您的问题更有意义。

与列表相比,元组是不可变的,这意味着您可以对它们进行切片,但不能就地修改它们。

于 2012-05-16T14:48:34.413 回答
2

我希望这有助于通过制作一个新列表来解释它的含义:

>>> lista = [1, 2, 3, 4]         
>>> listb = lista
>>> print lista
[1, 2, 3, 4]
>>> print listb
[1, 2, 3, 4]
>>> lista[0] = 3
>>> print listb
[3, 2, 3, 4]
>>> listc = lista[:]
>>> print listc
[3, 2, 3, 4]
>>> lista[0] = 1
>>> print listc
[3, 2, 3, 4]

这样做时,listb = lista您不是在制作新列表,而是在对同一列表进行额外引用。这通过用 更改 lista 中的第一个元素来显示lista[0] = 3,这也更改了 listb 中的第一个元素。但是,当您将 lista 切片到 listc 时,listc = lista[:]您正在复制这些值。当用 将 lista 的第一个元素改回 1 时lista[0] = 1,listc 的第一个元素仍然是 3。

对于速度,我希望切片会更慢,但这应该是使用哪一个的考虑因素。正如我所展示的,它们都有非常不同的含义,这取决于您要对列表做什么,而不是速度(这是一般情况。在某些情况下速度可能很重要)。

于 2012-05-16T14:56:47.490 回答
0
  1. “新”表示您切片的列表部分的浅表副本。

  2. 这取决于你想要做什么。对于您的特定实现,您可能不关心原始数据,但我相信您可以想出想要在不修改原始数据的情况下使用数据子集的场景(尽管请记住它只是一个浅复制,因此在很多情况下,您将在处理切片时修改原始数据和切片中的数据)。此外,它并不快。事实上,它实际上更慢,因为系统需要分配内存并构造新对象。增益不是速度,而是功能。

于 2012-05-16T14:57:26.373 回答
0

当一个函数/方法创建一个新列表时,这意味着您的脚本必须消耗双倍的内存,并且在创建旧列表的副本时有一点(或不是那么少)开销。

如果列表真的很大,你的脚本的性能会下降得很快。这就是为什么当您拥有大量数据时首选就地更改列表的原因。

于 2012-05-16T14:57:44.710 回答