[len(a):] = [x]和[len(a)] = [x]之间的差异

时间:2015-10-06 15:22:49

标签: python

为什么a[len(a):] = [x]等同于a.append(x),但a[len(a)] = [x]会超出范围错误?

3 个答案:

答案 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']