Python列表(切片方法)

3

我是一个Python新手,无论在哪里阅读关于列表方法的内容,我都看到一件事情:

切片方法返回一个“新”的列表

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

Python是否真的会影响原始列表并且这是否很重要呢?毕竟我无论如何都不会使用它。


1
顺便说一下,如果你想在Python中检查是否仍然拥有相同的对象,你可以始终使用id()进行比较。 - snies
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]

您可以选择哪种方式更适合您的问题。

与列表不同,元组是不可变的,这意味着您可以对它们进行切片,但无法在原地修改它们。


当我使用append方法时会发生什么?原始列表被操作了还是创建了一个新的列表,现在我的变量名指向新的列表? - Kartik Anand
所以append函数不会返回任何东西,我这里是对的吗? - Kartik Anand
@KartikAnand:是的:http://docs.python.org/tutorial/datastructures.html#more-on-lists - NPE
2
@KartikAnand:正是为了这样的问题才创建了文档。只需要查阅文档即可。 - Steven Rumbalski
请查看以下链接:http://docs.python.org/tutorial/introduction.html#lists 和 http://docs.python.org/tutorial/datastructures.html。前者是关于列表的非正式介绍,后者则是参考资料。 - Levon
显示剩余3条评论

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中的第一个元素。然而,当用listc = lista[:]将lista切片成listc时,你正在复制值。当使用lista[0] = 1将lista的第一个元素改回1时,listc的第一个元素仍然是3。
为了速度,我希望切片比较慢,但这不应该是选择哪个方法的考虑因素。正如我所展示的,它们都有非常不同的含义,这取决于你打算对列表做什么,而不是速度(这是一般情况。有时速度可能很重要)。

0
1. "new" 意味着对你切片的列表部分进行浅拷贝。 2. 这取决于你想要做什么。对于你特定的实现,你可能不关心原始数据,但我相信你可以想出一些情景,在这些情景中,你希望在不修改原始数据的情况下使用数据的子集(尽管请记住它只是一个浅拷贝,所以在处理切片时,有很多情况下你将修改原始数据)。此外,它并不更快;事实上,它实际上更慢,因为系统需要分配内存并构造新对象。收益不在于速度,而在于功能性。

0
当一个函数/方法创建一个新列表时,这意味着您的脚本必须消耗双倍的内存,并在创建旧列表的副本时具有一些(或不太少的)开销。
如果列表非常大,脚本性能会非常快地下降。这就是为什么当您拥有大量数据时,首选原地更改列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接