为什么a[len(a):] = [x]
等同于a.append(x)
,但a[len(a)] = [x]
会超出范围错误?
答案 0 :(得分:4)
Per the documentation(强调我的):
如果目标是订阅:...
如果primary是可变序列对象(例如列表),则下标必须生成一个普通整数。如果是负面的话 序列的长度被添加到它。结果值必须是a 非负整数小于序列的长度和序列 被要求将指定的对象分配给具有该索引的项目。 如果索引超出范围,则会引发IndexError(分配给下标序列无法将新项目添加到列表中)
...
如果目标是切片:评估参考中的主表达式。它应该产生一个可变序列对象(例如 列表)。指定的对象应该是相同的序列对象 类型。接下来,评估下限和上限表达式, 只要他们在场;默认值为零和序列的长度。 边界应该评估为(小)整数。如果有任何约束 否定,序列的长度被添加到它。由此产生的界限 被剪裁为位于零和序列的长度之间,包括在内。 最后,要求序列对象用切换替换切片 已分配序列的项目。 切片的长度可以是 不同于指定序列的长度,从而改变了 目标序列的长度,如果对象允许的话。
因此,对切片的赋值可以更改列表的长度,但是不能分配给索引(订阅)。
答案 1 :(得分:3)
因为这是语言的明确选择;分配给指数需要这些指数存在。分配到切片将根据需要扩展或收缩列表以适应新的大小。
答案 2 :(得分:2)
Python的切片通常更多"宽容"而不是用数字索引(按设计)。例如:
lst = []
lst[1:100] # No exception here.
我认为切片分配案例只是这个"宽恕"的延伸。有趣的是,你甚至可以使用超出范围的指数:
a = []
a[100:101] = ['foo']