我正在学习Python,以前是做C#/Java的开发工作,最近在研究列表的行为。我已经阅读了一些文档,但我不明白为什么在长度-1之外的索引上使用切片会导致可以添加项目。
ls = ["a", "b", "c", "d"]
n = len(ls) # n = 4
letter = ls[4] # index out of range (list indexes are 0 - 3)
# the following all do the same thing
ls += ["echo"]
ls.append("foxtrot")
ls[len(ls):] = ["golf"] # equivalent to ls[len(ls): len(ls)]
print(ls)
尽管对我来说看起来很奇怪,但我理解切片如何修改它们操作的列表。我不明白的是为什么
list[len(list)]
会导致预期的越界错误,而 list[len(list):]
却不会。我了解切片与索引根本不同,只是不知道当切片从列表值之外的索引开始时内部会发生什么。为什么我可以从以不存在元素 (
len(list)
) 开头的列表返回一个切片?这为什么允许我扩展列表?此外,在上述三种附加项目的方法中,哪一种从约定或性能的角度更受欢迎?它们中是否存在性能缺陷?
ls += ["alpha"]
或ls.append("tango")
。从性能角度来看,这取决于您的Python解释器。 - DainDwarfls +=
要求ls
在本地作用域中(或在函数中给予global
声明),因为它执行的是赋值操作,但ls.append
可以作用于全局变量,因为它仅仅是对现有可变对象的方法调用,而不是赋值。 - PM 2Ring