您可以在 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_1
和 list_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]]
这可能是您遇到问题的原因。
我正在了解列表和 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_1
和 list_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]]
这可能是您遇到问题的原因。