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

为何Example1追加列表时出现重复值?两类代码输出差异解析

为什么Example1会返回重复值?

你期望两段代码都返回[[4], [4, 3], [4, 3, 2], [4, 3, 2, 1]],但Example1输出全重复的列表,核心原因是Python中列表是可变对象,直接append列表引用会导致所有元素指向同一个对象。

示例代码回顾

Example1:

def Example1(arr):
   listToInput = []
   result = []
   for i in range(len(arr) - 1, -1, -1):
       listToInput.append(arr[i])
       result.append(listToInput)
   return result 

Example2:

def Example2(arr):
   listToInput = []
   result = []
   for i in range(len(arr) - 1, -1, -1):
       listToInput.append(arr[i])
       result.append(list(listToInput))
   return result 

执行结果:

print(Example1([1,2,3,4])) # 输出为 [[4, 3, 2, 1], [4, 3, 2, 1], [4, 3, 2, 1], [4, 3, 2, 1]]
print(Example2([1,2,3,4])) # 输出为 [[4], [4, 3], [4, 3, 2], [4, 3, 2, 1]]

原因分析

  • Example1的问题:
    result.append(listToInput) 语句中,你添加到result里的是listToInput这个列表对象的引用,而非当前列表内容的副本。循环过程中,每次listToInput.append(arr[i])都会修改同一个列表对象,result里所有已添加的引用都会指向这个被不断修改的列表。当循环结束时,listToInput最终状态是[4,3,2,1],所以result里的四个元素都是指向这个列表的引用,输出自然全是重复值。

  • Example2的解决逻辑:
    result.append(list(listToInput)) 中,list(listToInput)会创建一个新的列表对象,并把当前listToInput的内容复制进去。每次循环都会生成独立的新列表,后续修改listToInput不会影响已经添加到result里的那些列表,因此输出符合预期。

其他等价写法

除了用list()创建副本,你还可以用切片语法实现同样的效果:

result.append(listToInput[:])

或者用列表推导式:

result.append([x for x in listToInput])

这些写法都会生成当前listToInput内容的独立副本,避免引用同一对象的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:35:41