Python 中 for 循环中 list.append() 和 list.clear 的预期行为[重复]

问题描述 投票:0回答:1

我创建了一个大列表,我尝试使用 for 循环附加 10 个列表。 我在 for 循环之外创建了一个小列表。在每次迭代开始时,我都会清除小列表,然后在小列表中插入 1 到 10 之间的任何随机数。 然后,我将小列表附加到大列表中,并打印小列表的内容。 for循环终止后,我再次打印大列表的内容。理想情况下,大列表的内容和内部打印语句的输出应该相同。但发现大列表的内容是小列表中最后迭代的元素。 这是无法解释的。

import random as r
def try1():
    biglst = []
    smalllist = []
    for i in range(10):
        smalllist.clear()
        smalllist.append(r.randint(1, 10))
        print(smalllist)
        biglst.append(smalllist)
    print("_____________End of for loop__________")
    for i in biglst:
        print(i)
try1()

输出截图为:

而biglist的内容应该与for循环中print语句的输出相同。 有人能解释一下这种行为吗?

print语句的输出应该等于big list的内容。但大列表正在复制 for 循环最后一次迭代的值。

python python-3.x for-loop append
1个回答
0
投票

您正在附加相同的

smallist
对象,这会导致代码中出现意外行为。 发生这种情况的原因是,您每次迭代清除的
smallist
对象与您附加到
biglst
的对象相同,因为您添加的
smallist
对象在内存中使用相同的引用或 id。 您可以通过在每次迭代中运行
id(smallist)
来验证这一点。 灵魂是将
smallist
附加到
biglist
时,您应该附加一个 copy 而不是 object 本身。

在您所询问的内容中,您可以使用以下代码:

import random as r
def try1():
    biglst = []
    smalllist = []
    for i in range(10):
        smalllist.clear()
        smalllist.append(r.randint(1, 10))
        biglst.append(smalllist.copy()) # a copy of smallist object
        print(biglst)
    print("_____________End of for loop__________")
    print(biglst)
try1()
© www.soinside.com 2019 - 2024. All rights reserved.