kin_sin
kin_sin
采纳率50%
2021-01-08 12:41 阅读 1

python3一个简单问题求解答。

 a,b=b,a显然是常用的交换方法,但是在list切片中出现了以下情况,请问发生了什么,是否涉及什么原理

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • 已采纳
    qqzhuimengren PythonJavaC++go 2021-01-08 18:01

    切片索引赋值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时列表是有发生变化的,这两点自己去理解即可)

    点赞 1 评论 复制链接分享
  • qqzhuimengren PythonJavaC++go 2021-01-08 14:41

    切片索引的赋值。

    例如a[k:] = a[:k]; (x = y)即用列表a从0到k位的数据覆盖列表a从k位到尾的数据,y多出来的则自动扩展x

    点赞 1 评论 复制链接分享
  • qqzhuimengren PythonJavaC++go 2021-01-08 17:11

    切片索引赋值:

    2. 当切片索引大于原列表最大个数时,切出来空列表,此时赋值相当于往末尾添加元素,即list的extend操作

     

    点赞 1 评论 复制链接分享
  • kin_sin kin_sin 2021-01-08 15:25

    没看太懂您的意思,当我输入k=7的时候,结果是[8, 9, 10, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7]      k=9的时候是[10, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9],这样还能用索引赋值理解吗,我不理解b的交换过程和前后顺序

    点赞 评论 复制链接分享
  • kin_sin kin_sin 2021-01-11 09:58

    您的举例发挥了莫大的作用,因为我验证了其他几个运行结果,确实如您所说。感谢您细心的说明讲解,我已经完全理解了!

    点赞 评论 复制链接分享

相关推荐