切片赋值?
今天突然看到一个很有趣的问题,是将一个列表的切片进行了赋值,比如
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
a[2:4] = [***]
这样的形式。
当我看到答案的时候还真愣了一下,今天来总结一波。
先说明两个问题:
- 对一个切片进行整体赋值是可以影响原列表的,但如果是只改变一个元素,是不会有影响的。
(这个问题实际上是可变不可变类型的问题,你换一个可变类型的元素,修改一下他就不会变了。b的指针位置和a是相同的,但是有一个位置的索引发生了改变,但a没有发生改变) - 我们对一个 切片赋值是一定要给一个列表的,你整一个元素上去,玩呢?
看我操作
from icecream import ic
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
ic(a[2:4])
'''ic| a[2:4]: ['b', 'b']'''
# 先来一个等长的,这个好说就是直接替换么
a[2:4] = ['1', '2']
ic(a)
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
'''ic| a: ['x', 'y', '1', '2', 'y', 'y', 'd', 's'], 直接替换'''
# 来一个不等长的
a[5:] = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
ic(a)
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
'''ic| a: ['x', 'y', 'b', 'b', 'y', 'x', 'y', 'b', 'b', 'y', 'y', 'd', 's'],
从5开始直接替换,多的补上'''
# 如果不等长的在中间呢
a[2:4] = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
ic(a)
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
'''ic| a: ['x', 'y', 'x', 'y', 'b', 'b', 'y', 'y', 'd', 's', 'y', 'y', 'd', 's'],
将2、3替换掉,还是多的补在位置的后面'''
# 其实这个时候,短的已经能猜到了吧
a[2:] = [1, 2]
ic(a)
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
'''ic| a: ['x', 'y', 1, 2], 直接替换,少的不管'''
# 短的在中间
a[2:6] = [1, 2]
ic(a)
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
'''ic| a: ['x', 'y', 1, 2, 'd', 's'], 2~5替换,剩下不管,少了就少了'''
# 特殊一点,就是空对空
a[2:2] = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
ic(a)
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
'''ic| a: ['x', 'y', 'x', 'y', 'b', 'b', 'y', 'y', 'd', 's', 'b', 'b', 'y', 'y', 'd', 's'],
相当于是插入'''
a[2:4] = []
ic(a)
a = ['x', 'y', 'b', 'b', 'y', 'y', 'd', 's']
'''ic| a: ['x', 'y', 'y', 'y', 'd', 's'], 相当于是删除'''
其实这看来设计也很明显了,还是根据你切片选中的元素来进行替换,如果替换的内容少就直接删除,多就直接在后面填上,如果是空,就相当于是删除和插入。
([2:2]为啥是空不用多说了吧)