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

Viewed 1958

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

a = [1,2,3,4,5]
for i in a:
    rec = a.pop()
    print(a)
    a.insert(0,rec)
print(a)
1 Answers

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

关于算法:
这个程序相当于是遍历列表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>
"""

感谢您的回答,这个问题是我昨天头脑发热问的,其实今天一早再看一下子就理解了,但是这么简单的问题您还是详细的回答,实在的感谢您