Python列表的奇怪行为
为什么这段代码在Python解释器运行时不会抛出错误Python列表的奇怪行为,python,list,Python,List,为什么这段代码在Python解释器运行时不会抛出错误 a = ['A', 'B', 'C'] a[20:] = ['D', 'E'] print a 输出是['A','B','C','D','E']。我以为Python会在第二条语句中给我一个错误,因为a只有3个元素。编码时,此功能是否有任何自然用途 python就是这样工作的。在用于切片的python中,不会进行边界检查。它只是扩展您的列表,因为它是一个可变对象 当您通过切片读取边界时,这也很有趣: f = a[20:] f将是一个空列表
a = ['A', 'B', 'C']
a[20:] = ['D', 'E']
print a
输出是
['A','B','C','D','E']
。我以为Python会在第二条语句中给我一个错误,因为a
只有3个元素。编码时,此功能是否有任何自然用途 python就是这样工作的。在用于切片的python中,不会进行边界检查。它只是扩展您的列表,因为它是一个可变对象
当您通过切片读取边界时,这也很有趣:
f = a[20:]
f
将是一个空列表 这比阅读a[20:][/code>意义要小得多。非常奇怪的是,assert['D','E']==a[20:][/code>会在这里失败,这对于切片索引的工作方式是有意义的。由于a[3:][==a[20:][/code>,因此,由于C级别的内部实现,如果为空,它将简单地附加元素或覆盖所选范围。@Eric:a[20:][/code>将只返回一个空列表。@tuxtimo:确实如此。我的观点是,以下行为与a[:20]=x的行为相同,这让我觉得是不正确的行为;第一眼就断言一个[:20]==x
@Eric=Yes。如果你仔细看:如前所述,带有切片的赋值没有边界检查,所以它只是将项附加到列表中(这就是它的工作方式,我不知道确切的impl细节)。我能说的是,值不会插入到切片的开始,而不是列表的结尾。因此,您无法在预期的位置访问它们。