通过值或引用捕获 lambda

lambda capture by value or reference

我想知道如何在 python 中按值和引用捕获变量。

让我们看一下代码。

我有 MyClass 和一个 属性 - 实例名称和列表。

from itertools import ifilter

class MyClass:
  def __init__(self, name):
    self.name = name

mycl_list = [MyClass("boo"), MyClass("boo"),MyClass("bar"),MyClass("bar")]

接下来我想 "sort" 这些实例按它们的值放入字典中。 问题是结果代码 returns "bar" 而不是 "boo".

如果我将 ifilter 切换为 filterlist(ifilter(...)),则结果输出将为 "boo"。

mycl_by_name = {}
for mycl_instance in mycl_list:
  name = mycl_instance.name
  mycl_by_name.setdefault(name, ifilter(lambda _mycl_instance: _mycl_instance.name == name, mycl_list))

for boo_named in mycl_by_name["boo"]:
  print (boo_named.name)

从 C++ 的角度来看,我看到了通过引用将 name 变量捕获到 ifilter lambda 中的问题。所以我需要以某种方式将 "deepcopy" 变量命名为 lambda

P.S。是的,我知道字典中的生成器在打印后会耗尽。

  • 您不能按 python 中的值捕获。

  • 您需要引入新的范围来解决问题。 (是的,在 python 中 for-loop 不会创建新范围)


mycl_by_name = {}
for mycl_instance in mycl_list:
  def f():
    name = mycl_instance.name
    mycl_by_name.setdefault(name, ifilter(lambda _mycl_instance: _mycl_instance.name == name, mycl_list))
  f()

for boo_named in mycl_by_name["boo"]:
  print (boo_named.name)