您可以在 while 循环中将列表存储到列表中吗?

Can you store a list to a list inside a while loop?

我正在了解列表和 while 循环在 Python 中的工作原理。不幸的是,我对我的代码有点困惑。

main_list = []
list_1 = [1, 2]
list_2 = [3, 4]

i = 0
n = 2

while i != n:

    number = int(input("Insert a number: "))

    list_1.append(number)
    main_list.append(list_1)
    main_list.append(list_2)

    i += 1

print(main_list)

为什么我得到这个输出,

>> Insert a number: 2
>> Insert a number: 3
>> [[1, 2, 2, 3], [3, 4], [1, 2, 2, 3], [3, 4]]

而不是这个?

>> Insert a number: 2
>> Insert a number: 3
>> [[1, 2, 2], [3, 4], [1, 2, 2, 3], [3, 4]]

如果有人能给我解释一下,我将不胜感激。

您正在将 list1 添加到 main_list。所以 list1 的引用存储在那里。因此,当您更改 list1 时,它会在每个位置更改列表。

您可以在将列表添加到列表之前创建列表的副本

main_list = []
list_1 = [1, 2]
list_2 = [3, 4]

i = 0
n = 2

while i != n:

    number = int(input("Insert a number: "))

    list_1.append(number)
    main_list.append(list_1.copy())
    main_list.append(list_2)

    i += 1

print(main_list)

原因是 main_list 包含对 list_1list_2 的引用,而不是它们的副本。要清楚地看到这一点,请将以下行添加到代码底部,

list_1.append(10)

print(main_list)

您现在将获得以下输出,

[[1, 2, 2, 3], [3, 4], [1, 2, 2, 3], [3, 4]]
[[1, 2, 2, 3, 10], [3, 4], [1, 2, 2, 3, 10], [3, 4]]

要停止这种行为,您必须使用 copy 库明确复制列表,

import copy

main_list = []
list_1 = [1, 2]
list_2 = [3, 4]

i = 0
n = 2

while i != n:

    number = int(input("Insert a number: "))

    list_1.append(number)
    main_list.append(copy.copy(list_1))
    main_list.append(copy.copy(list_2))

    i += 1

print(main_list)

现在你的输出就是你最初想要的,

[[1, 2, 2], [3, 4], [1, 2, 2, 3], [3, 4]]

那是因为您在 while 循环中修改 list_1 并将其附加到 main_list。但是当你追加时,只有 list_1 的引用被添加到 main_list.

现在最后 list_1 内容是 [1,2,2,3]。由于 main_list 包含对 list_1 的引用,main_list 显示 list_1 的当前内容,即 [1,2,2,3].

为避免这种情况,您必须附加 list_1 的内容而不是对 main_list 的引用。有很多方法可以做到。

其中之一是,

main_list.append(list(list_1))

将您现有的行更改为此。

请阅读此 - Shallow vs Deep Copy

您的代码:

main_list = []
list_1 = [1, 2]
list_2 = [3, 4]
i = 0
n = 2
while i != n:

    number = int(input("Insert a number: "))   
    list_1.append(number)    
    main_list.append(list_1)    
    main_list.append(list_2)    
    i += 1

print(main_list)

第一次迭代后:

main_list = [[1,2,2],[3,4]]
list_1 = [1, 2, 2]
list_2 = [3, 4]

第二次迭代后:

main_list = [[1,2,2,3],[3,4], [1,2,2,3],[3,4]]
list_1 = [1, 2, 2,3]
list_2 = [3, 4]

需要考虑的是: 在引擎盖下 python 有 REFERENCE_TYPE 所以基本上你的 main_list 是这样的:

main_list= [
[reference_of_list1],[reference_of_list2],
[reference_of_list1],[reference_of_list2]]

这可能是您遇到问题的原因。