python-3.x 我不明白为什么这两个代码没有相同的输出[重复]

stszievb  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(109)

此问题已在此处有答案

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)作为一个变量(其值与列表相同),没有相同的输出,我期望两者给予相同的输出

oyxsuwqo

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列表是一个 * 对象 ,它存在于一个叫做“堆”的空间中。mainlsttmplist是 * 变量, 但在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函数构造一个新的列表,其内容与给定列表相同,然后返回对新列表的引用。

mw3dktmi

mw3dktmi2#

在第二个例子中,每次都引用mainlst。如果您将代码更改为:

mainlst = [0,0,0,0,0]
for i in range(5):
    templst = mainlst.copy()
    templst[i] = 1
    print(templst)

你会得到同样的结果。查找更多关于python数组和深拷贝与浅拷贝的信息。
https://realpython.com/copying-python-objects/

相关问题