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

