我有这个代码:lst = []given = [1, 2, 3, 4, 5]result = []for item in given: lst.append(item) print(lst) result.append(lst)print(result)我预期的结果是[[1], [1, 2], [1, 2, 3], ...],但显示的结果是[[1, 2, 3, 4, 5], ...]与12345重复5次。怎么了?lst打印是预期的,这是[1]用于第一个循环,[1, 2]用于第二个循环,依此类推。
3 回答
慕森王
TA贡献1777条经验 获得超3个赞
问题是您正在附加列表,这相当于将引用对象附加到原始列表。因此,无论何时修改原始列表,更改都会反映在创建引用的位置,在本例中为result。当你通过不断迭代的for循环,你的所有引用的附加result不断得到与的最新值更新lst。最终结果是,在 for 循环结束时,您已向原始列表追加了 5 个引用,lst并且所有引用都存储了lstbeing的最新值[1,2,3,4,5]。
有几种方法可以避免这种情况。您需要的是仅复制值。其中之一是使用lst[:]. 另一种方法是使用lst.copy()
for item in given:
lst.append(item)
print(lst)
result.append(lst[:])
print (result)
# [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]
猛跑小猪
TA贡献1858条经验 获得超8个赞
List 是一种可变数据类型,在内存中只有一个列表副本,除非您将其显式添加copy
到另一个变量。所以
result.append(lst)
只是附加一个真实副本的引用,所有引用都指向同一个副本。
总之,您应该了解 Python 中的可变/不可变数据类型和引用计数。
添加回答
举报
0/150
提交
取消