【问题标题】:Can you store a list to a list inside a while loop?您可以将列表存储到while循环内的列表中吗?
【发布时间】:2021-10-11 22:32:17
【问题描述】:

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

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]]

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

【问题讨论】:

  • 我认为它会在每个引用该列表的地方更改列表
  • main_list 包含 list_1list_2 两次,因为那是您放入的内容。 list_1[1,2,2,3] 因为那是你在里面放的。
  • 您也可以在pythontutor.com 中运行此程序,以直观地查看每个步骤的运行情况。

标签: python list loops while-loop


【解决方案1】:

您正在将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)

【讨论】:

  • @JuventiusKriswijanarko 如果对您有帮助,您应该接受答案。 :)
【解决方案2】:

原因是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]]

【讨论】:

  • @JuventiusKriswijanarko 如果这有助于您单击向上按钮或单击对勾或单击两者,以便其他用户可以看到哪些答案有帮助。
【解决方案3】:

那是因为您在 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

【讨论】:

    【解决方案4】:

    您的代码:

    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 所以基本上你的 ma​​in_list 是这样的:

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

    所以这可能是您面临问题的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-31
      • 2015-05-03
      • 2016-04-06
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多