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

Python中for循环追加列表出现神秘重复数组的原因探究

两个for循环结果不一致的核心原因

本质是Python中可变对象的引用传递和副本创建的区别,列表(list)属于典型的可变对象,变量存储的是对象的内存地址,而非对象本身的内容。


第一个循环的执行逻辑

for num in range(0,3):
  tempArr.append(arr[num])
  res.append(tempArr)
  print(tempArr, res)
  • 整个循环过程中始终只有1个tempArr列表对象,每次append操作都是直接修改这同一个列表的内容。
  • 执行res.append(tempArr)时,只是把tempArr的内存引用(可以理解为指向这个列表的指针)存入res,没有复制列表内容。
  • 循环结束后res里的3个元素,本质上全是指向同一个tempArr的引用。所以不管什么时候打印res,所有元素展示的都是tempArr当前的最新值,最终就出现三个元素完全相同的结果。

第二个循环的执行逻辑

for num in range(0,3):
  tempArr.append(arr[num])
  res.append(list(tempArr))
  print(tempArr, res)
  • 执行res.append(list(tempArr))时,list(tempArr)会基于当前tempArr的内容,创建一个全新的独立列表副本,再把这个新副本的引用存入res。
  • 每次循环生成的副本都是完全独立的对象,后续修改tempArr追加新元素时,之前已经存入res的副本不会受到任何影响。
  • 循环结束后res里存的是3个独立的列表对象,分别对应三次循环节点上tempArr的瞬时状态,所以最终结果是逐次追加元素的状态。

快速验证方法

可以在循环结束后打印res中每个元素的内存地址:

  • 第一个循环打印id(res[0]), id(res[1]), id(res[2]),三个地址完全相同,证明是同一个对象。
  • 第二个循环打印三个元素的id,地址完全不同,证明是三个独立对象。

内容的提问来源于stack exchange,提问作者Carlos Cuartas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:27:23