为何Python中输入列表的值在循环过程中不断变化?
为什么列表a在循环的每一步都会发生变化?
这事儿的核心原因其实很简单:Python里的列表是「可变对象」,当你执行b = a这行代码时,并不是把列表a里的内容完完整整复制一份给b,而是让b和a指向内存中同一个列表对象。打个比方,就像两个人拿着同一把钥匙开同一扇门,不管谁进去改了屋里的东西,另一个人开门看到的都是修改后的样子。
咱们来一步步拆解你的代码,就能看得更清楚了:
初始状态:
a = [1,2,3,4,5] b = a此时内存里只有一个列表
[1,2,3,4,5],变量a和b都是这个列表的“引用”——说白了就是它们都指向同一个东西。第一次循环(i=0):
- 计算
c = 0 - 4 = -4,Python的负索引是从列表末尾往前数,-4对应列表的第2个元素(索引为1,因为索引从0开始,-1是最后一个元素,-4就是倒数第4个)。 - 执行
b[c] = a[i],也就是b[1] = a[0],把列表索引1的位置改成了1。 - 因为a和b指向同一个列表,所以不管打印a还是b,结果都是
[1,1,3,4,5],这就是你看到的第一次修改后的输出。
- 计算
第二次循环(i=1):
- 计算
c = 1 - 4 = -3,对应列表的索引2(倒数第3个元素)。 - 执行
b[c] = a[i],也就是b[2] = a[1],此时a[1]的值已经是1了,所以把索引2的位置也改成1,列表变成[1,1,1,4,5],自然a和b的输出又一起变了。
- 计算
如果你想让b成为a的独立副本,修改b的时候不影响a,可以用这些方法:
- 用列表的
copy()方法:b = a.copy() - 用切片语法:
b = a[:] - 用
list()构造函数:b = list(a)
比如修改后的代码:
a = [1,2,3,4,5] b = a.copy() for i in range(len(a)): c = (i - 4) print(a) print(b) b[c] = a[i] print(a) print(b)
这时候你会发现a始终保持初始值不变,因为b现在指向的是一个新的列表对象了。
内容的提问来源于stack exchange,提问作者Sudhir Kumar Shahu
相关产品推荐
相关产品推荐

