Skip to main content
 首页 » 编程设计

python之为什么我的 lambda 消失了

2025年05月04日14lori

我有一些依赖于传递一些 lambda 的 Python 代码,它们被复制到几个不同的地方,但我发现当我将它们从列表中弹出时,它们会神奇地从所有其他列表中消失.我不知道这是否是错误。我会注意到我在 CPython 上运行它。

下面是一些代码来说明我的观点:

a = lambda x: x+x*3 
b = [] 
c = [] 
 
for i in range(3): 
    b.append(a) 
 
for i in range(3): 
    c.append(b) 
 
while b: 
    print b.pop()(5) 
 
for d in c: 
    while d: 
        print d.pop()(10) 

如果 Python 正在执行引用计数,新列表应该会增加引用计数,但 lambda 会一直消失。

我什至尝试这样做,以便每次通过第一个循环时都会创建一个新的 lambda 实例:

b = [] 
c = [] 
 
for i in range(3): 
    b.append(lambda x: x+x*3) 
 
for i in range(3): 
    c.append(b) 
 
while b: 
    print b.pop()(5) 
 
for d in c: 
    while d: 
        print d.pop()(10) 

还是不行。

有人知道这里发生了什么吗?

请您参考如下方法:

list.pop 就地修改列表。因此,每个引用该列表的人都会看到相同的更改。您没有在第二个中存储副本,您只是存储了对一个列表的多个引用,然后在第一个 while 循环中将其清空。

您可以通过a[:] 复制列表(它是从开始到结束的一个切片,包括两者)——注意它是一个shallow copy。 - 几乎所有内容(包括您自己的类的实例)都带有 copy 模块。