此问题已在此处有答案:
List of lists changes reflected across sublists unexpectedly(17回答)
3天前关闭。
输入1:
for i in range(5):
lst = [0,0,0,0,0]
lst[i] = 1
print(lst)
输出1:
1, 0, 0, 0, 0
0, 1, 0, 0, 0
0, 0, 1, 0, 0
0, 0, 0, 1, 0
0, 0, 0, 0, 1
输入2:
mainlst = [0,0,0,0,0]
for i in range(5):
templst = mainlst
templst[i] = 1
print(templst)
输出2:
1, 0, 0, 0, 0
1, 1, 0, 0, 0
1, 1, 1, 0, 0
1, 1, 1, 1, 0
1, 1, 1, 1, 1
为什么赋值给一个变量,1)作为一个列表,2)作为一个变量(其值与列表相同),没有相同的输出,我期望两者给予相同的输出
2条答案
按热度按时间oyxsuwqo1#
表达式
[0,0,0,0,0]
在每次执行时构造一个新的列表对象。第一个示例在循环每次执行lst = [0,0,0,0,0]
时构造一个包含五个零的新列表。在第二个示例中,
mainlst = [0,0,0,0,0]
只执行一次。赋值templst = mainlst
除了将局部变量tmplst
设置为引用mainlst
引用的同一个已经存在的列表对象之外,不做任何事情。第二个循环在每次迭代中重复使用相同的列表。更新
如果我也沿着输出“mainlst”和“templst”,列表“mainlst”也会变成和“templst”一样,而在我的代码中,我没有在任何地方改变mainlst的值。
mainlst
不是列表。tmplist
不是列表。[0,0,0,0,0]
不是列表。Python列表是一个 * 对象 ,它存在于一个叫做“堆”的空间中。mainlst
和tmplist
是 * 变量, 但在Python中(不像C或C++),变量不可能包含列表。一个变量只能引用一个列表。[0,0,0,0,0]
是一个 * 表达式 *,它构造一个新的列表并返回一个对它的引用。mainlst=[0,0,0,0,0]
是一个 * 声明 ;1.创建一个新变量
mainlst
,1. 计算 *
[0,0,0,0,0]
表达式,创建一个新列表,然后1.将对新列表的引用存储到新变量中。
templst=mainlst
是一条语句,它创建了另一个新变量templist
,并使它引用与mainlst
相同的列表对象。当你写
templst[i]=1
时,它不会 * 也 * 改变mainlst
。它改变了唯一一个 both 变量引用的列表。如果你想创建一个 new list-一个
mainlst
复制到的list的副本-然后按照@russhoppa告诉你的去做:templst=mainlst.copy()
。copy
函数构造一个新的列表,其内容与给定列表相同,然后返回对新列表的引用。mw3dktmi2#
在第二个例子中,每次都引用
mainlst
。如果您将代码更改为:你会得到同样的结果。查找更多关于python数组和深拷贝与浅拷贝的信息。
https://realpython.com/copying-python-objects/