我是python的新手,无论我在哪里读到列表方法,我都会看到一件事
切片方法返回“新”列表
这里的“新”列表是什么意思,为什么它比更改原始列表更快?
如果python操作原始列表真的很重要,我的意思是我无论如何也无法使用它。
答案 0 :(得分: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]
由您决定哪种方式对您的问题更有意义。
与列表相比,元组是不可变的,这意味着您可以对它们进行切片,但不能对其进行修改。
答案 1 :(得分: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[0] = 3
更改lista中的第一个元素来显示,这也会更改listb中的第一个元素。但是,当将lista切换到带有listc = lista[:]
的listc时,您正在复制值。使用lista[0] = 1
将lista的第一个元素更改回1时,listc的第一个元素仍为3.
对于速度,我希望切片速度较慢但是不应该考虑使用哪一个。正如我所展示的,它们都有一个非常不同的含义,它取决于你要对列表做什么,而不是速度(这是一般的。有时候速度可能很重要)。
答案 2 :(得分:0)
“new”表示您切片列表部分的浅表副本。
这取决于你想要做什么。对于您的特定实现,您可能不关心原始数据,但我确信您可以想出在不修改原始数据的情况下使用数据子集的情况(尽管请记住它只是一个浅的复制,因此在处理切片时,有许多实例会在原始和切片中修改数据)。而且,它并不快;实际上,它实际上更慢,因为系统需要分配内存并构造新对象。增益不是速度,而是功能。
答案 3 :(得分:0)
当一个函数/方法创建一个新列表时,这意味着你的脚本必须消耗两倍的内存,并且在创建旧列表的副本时有一点(或没有那么少)的开销。
如果列表非常大,脚本的性能会下降得非常快。这就是为什么当你有大量数据时,首选就地更改列表。