为了账号安全,请及时绑定邮箱和手机立即绑定

在 for 循环中修改的附加变量无法按预期工作

在 for 循环中修改的附加变量无法按预期工作

汪汪一只猫 2021-09-25 09:38:22
我有这个代码: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]]


查看完整回答
反对 回复 2021-09-25
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

List 是一种可变数据类型,在内存中只有一个列表副本,除非您将其显式添加copy到另一个变量。所以

result.append(lst)

只是附加一个真实副本的引用,所有引用都指向同一个副本。

总之,您应该了解 Python 中的可变/不可变数据类型和引用计数。


查看完整回答
反对 回复 2021-09-25
  • 3 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信