a,b=b,a显然是常用的交换方法,但是在list切片中出现了以下情况,请问发生了什么,是否涉及什么原理
切片索引赋值3:
a[k:] = a[:k]; (x = y)即用列表a从0到k位的数据覆盖列表a从k位到尾的数据,y多出来的则自动扩展x,x第k位后面若有数值则自动后移,即执行的是insert。
list切片赋值,涉及到的大致就这三种情况了。
另外,x, y = y, x的本质就是tmp = x,x = y, y = tmp
x、y为列表切片时也是一样的。
你按tmp = x,x = y, y = tmp这个顺序。再结合切片索引的赋值情况去理解就可以了。
当k = 9 时。b那列:
# k = 9 # # tmp = a[:k] # [1, 2, 3, 4, 5, 6, 7, 8, 9], 此时a还是[1到10] # a[:k] = a[k:] # [10], 此时a 为[10, 10]; 因为a[:9] = [9:], 此时a的前9位数(a[:9])被10(即[9:])覆盖 # a[k:] = tmp # 运算前a 为[10, 10],a[k:] = []; tmp = [1-9]; 此时的运算即 a + 【】,此时的【】空列表为tmp,即a.exted(tmp),故运算后a=[10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9] # # # 反过来: b[k:], b[:k] = b[:k], b[k:],最终b =[10, 1-9] (第一步;tmp=[10], 第二步:b[k:]=[1-9],b=[1-9,1-9], )
你可以结合这个案例理解一下索引切片赋值。三种情况个人总结。
(上面不懂,没关系。按tmp = x,x = y, y = tmp这个顺序。x=y时列表是有发生变化的,这两点自己去理解即可)