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
相关产品推荐
相关产品推荐

