一个完整的切片表达式包含两个“:”用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时默认第三个参数step=1;当一个“:”也没有时,start_index=end_index表示切取start_index指定的那个元素。
step:正负数均可其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”正表示“从左往右”取值,负表示“从右往左”取值當step省略时,默认为1即从左往右以步长1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”重要的事情说彡遍!
start_index:表示起始索引(包含该索引对应值);该参数省略时,表示从对象“端点”开始取值至于是从“起点”还是从“终点”开始,則由step参数的正负决定step为正从“起点”开始,为负从“终点”开始
end_index:表示终止索引(不包含该索引对应值);该参数省略时,表示一直取到数据“端点”至于是到“起点”还是到“终点”,同样由step参数的正负决定step为正时直到“终点”,为负时直到“起点”
Python 列表的切片和赋值操作很基础の前也遇到过一些坑,以为自己很懂了但今天刷 Codewars 时发现了一个更大的坑,故在此记录
很多入门 Python 的人会犯这样一个错误:在赋值操作=
中搞不清是赋了“值”还是“引用”。比如:
他可能只想改变列表b
但實际上这样也会改变列表a
。
因为b
实际上是列表a
的另一个引用a
和b
是同一个对象,id(a) ==
id(b)
所以更改b
也会更改a
。这个应该大部分人都知道所以正確的代码应该使用切片来进行列表的复制:
好的,现在我们确定切片能够进行列表的复制那我们就能心安理得地改动新的列表了吗?请看二维列表(二维数组):
此时a
还是被改动了!
id(b[1])。因为列表里存储嘚是对象的引用!
列表 list 终究只是个容器就像 tuple 本身是 immutable (不可变)的,但它只是容器它可以存储一个可变对象,因此呈现出一种可以被改動的“假象”例如:
所以容器和它存储的对象不能混为一谈。所以对于这种二维列表想要进行完全的复制,请直接使用copy.deepcopy()
深度复制
如果只想复制一部分(切片),那可以先复制再切片:
此时修改b
没有影响到a