list[-1:][0]和list[len(list)-1]有什么区别?它们在IT技术中的应用是什么?

7
假设你想获取 Python 列表的最后一个元素:以下两种方式有何区别?
myList[-1:][0]

并且

myList[len(myList)-1]

我曾认为它们没有区别,但后来我尝试了这个。

>>> list = [0]
>>> list[-1:][0]
0
>>> list[-1:][0] += 1
>>> list
[0]
>>> list[len(list)-1] += 1
>>> list
[1]

我有点惊讶...


1
不确定为什么你要写 list[-1:][0];通常的写法是 list[-1]。另外,你可能想避免使用内置的 list() 作为列表名称而导致变量名冲突。 - kquinn
3个回答

15
如果您使用切片[-1:],返回的列表是浅拷贝而不是引用。因此,[-1:][0]将修改新列表。[len(list)-1]是最后一个对象的引用。

9
list[-1:] 创建了一个新的列表。要想获得与 list[len(list)-1] 相同的行为,它必须返回某种类型的 list 视图,但正如我所说,它创建了一个新的临时列表。然后你继续编辑临时列表。

不管怎样,你知道可以使用 list[-1] 来达到同样的效果,对吗?


3
切片会创建一个副本(浅复制)。它通常被用作一个浅拷贝惯用语。例如:
list2 = list1[:]

等同于

import copy
list2 = copy.copy(list1)

使用那种方式似乎不太易读/易懂,为什么它会被“经常使用”呢? - tgray
我同意它的可读性较差。为什么会被使用呢?我猜那是因为它不需要导入。 - vartec
你认为他们是否避免导入是因为它需要多一行代码,还是因为他们试图避免某种开销(内存、加载时间等)? - tgray
好的,例如list1[:]是一个表达式。copy.copy(list1)也是一个表达式。但是import copy; copy.copy(list1)不是。 - vartec
顺便提一下,这在文档中是被认可的。http://docs.python.org/library/copy.html “可以使用dict.copy()创建字典的浅拷贝,通过分配整个列表的切片,例如,copied_list = original_list[:],可以创建列表的浅拷贝。” - vartec

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