python列表list和遍历的一个疑问

各位大佬看,为什么在循环后,a的值还是原来的,并没有改变啊?

a = [1,2,3,4,5]
for i in a:
    rec = a.pop()
    print(a)
    a.insert(0,rec)
print(a)
阅读 323
评论 2019-07-12 提问
    1 个回答
    Miles
    • 3
    • 新人请关照

    不知道你是对你这个算法产生了疑问还是对各种数据类型在内存中如何存储不懂而产生的疑问。

    关于算法:
    这个程序相当于是遍历列表a,每次取出a的最后一个元素,再将这个元素插入到a的第一个位置。而且你完整循环一次a的内容当然还是跟最开始是一样的撒。
    这就有点像你有一篮子按顺序排好的鸡蛋,然后把鸡蛋一个一个按顺序拿出来,然后再一个一个按顺序放回篮子里。
    每次都是将最后一个鸡蛋拿出来,然后将篮子里剩下的鸡蛋不改变顺序的都朝后摞一个位置,然后再将拿出来的那个鸡蛋放在空出来的第一个位置。
    这样操作一遍之后,最后这篮子鸡蛋还是这篮子鸡蛋,顺序也依然是以前的那个顺序撒。

    关于不同数据类型在内存中的存储:

    • Python中对于变量的内存管理是引用为主的
    • a是列表(可变数据类型),修改列表内容,列表地址是不变的
    • 遍历列表a时得到的rec是整形变量,修改它的值其实是在修改它的指向,你可以结合下面这个程序来理解一下
    a = [1,2,3,4,5]
    print(a, id(a))     # 打印a以及a的内存地址
    for i in range(len(a)):
        print(id(a[i]), end=" ")    # 打印a中每个元素的地址
    
    print("")
    print("#" * 30)
    for i in a:
        rec = a.pop()
        print(f"addr of rec: {id(rec)}")    # 打印rec的内存地址
        # print(a)
        a.insert(0,rec)
    print(a, id(a))     # 打印a以及a的内存地址
    for i in range(len(a)):
        print(id(a[i]), end=" ")    # 打印a中每个元素的地址
    
    """
    ## 运行结果
    PS D:\Doc> & "C:/Program Files/Python37/python.exe" d:/Doc/temp/1.py
    [1, 2, 3, 4, 5] 1541890855496
    140704351219968 140704351220000 140704351220032 140704351220064 140704351220096
    ##############################
    addr of rec: 140704351220096
    addr of rec: 140704351220064
    addr of rec: 140704351220032
    addr of rec: 140704351220000
    addr of rec: 140704351219968
    [1, 2, 3, 4, 5] 1541890855496
    140704351219968 140704351220000 140704351220032 140704351220064 140704351220096
    PS D:\Doc>
    """
    评论 赞赏 2019-07-13
      撰写回答

      登录后参与交流、获取后续更新提醒

      社区建设
      合作问答

      欢迎来到 SegmentFault 0x 社区建设。这里可以讨论有关 SegmentFault 的一切,帮助我们改进产品、完善社...