通过值或引用捕获 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
切换为 filter
或 list(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)
我想知道如何在 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
切换为 filter
或 list(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)