You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python中输入列表的值在循环过程中不断变化?

为什么列表a在循环的每一步都会发生变化?

这事儿的核心原因其实很简单:Python里的列表是「可变对象」,当你执行b = a这行代码时,并不是把列表a里的内容完完整整复制一份给b,而是让b和a指向内存中同一个列表对象。打个比方,就像两个人拿着同一把钥匙开同一扇门,不管谁进去改了屋里的东西,另一个人开门看到的都是修改后的样子。

咱们来一步步拆解你的代码,就能看得更清楚了:

  1. 初始状态:

    a = [1,2,3,4,5]
    b = a
    

    此时内存里只有一个列表[1,2,3,4,5],变量a和b都是这个列表的“引用”——说白了就是它们都指向同一个东西。

  2. 第一次循环(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],这就是你看到的第一次修改后的输出。
  3. 第二次循环(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:02:41