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

我有这个代码:


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]用于第二个循环,依此类推。


汪汪一只猫
浏览 142回答 3
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]]

猛跑小猪

List 是一种可变数据类型,在内存中只有一个列表副本,除非您将其显式添加copy到另一个变量。所以result.append(lst)只是附加一个真实副本的引用,所有引用都指向同一个副本。总之,您应该了解 Python 中的可变/不可变数据类型和引用计数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python