具有 Lambda 值的字典更新所有条目
Dictionary With Lambda Values Updates All Entries
我在 Python 2.7。我有两个 classes 和一个 namedtuple。一个 class 包含一个字典作为实例属性和一个分配给该字典的函数。 (这是情况的一个非常简化的版本)。 namedtuple 很简单。另一个 class 是通过 add_to_test_dict
函数调用将条目添加到 test_dict
的。
然后我实例化 DictManipulator 并调用 test
函数:
from collections import namedtuple
class DictHolder(object):
def __init__(self):
self.test_dict = {}
def add_to_test_dict(self, key, val):
self.test_dict[key] = val
TestTuple = namedtuple('TestTuple', 'name data')
class DictManipulator(object):
def test(self):
named_tuple_list = [TestTuple(name='key1', data=1), TestTuple(name='key2', data=1000)]
self.my_dh = DictHolder()
for item in named_tuple_list:
self.my_dh.add_to_test_dict(item.name, lambda: item.data)
my_dm = DictManipulator()
my_dm.test()
print('key1 value: ', my_dm.my_dh.test_dict['key1']())
print('key2 value: ', my_dm.my_dh.test_dict['key2']())
# ('key1 value: ', 1000)
# ('key2 value: ', 1000)
为什么两个键 return 那里的值相同?我已经试验够了,原来的 named_tuple_list 没有更新,我也试过用 lambda: copy.deepcopy(item.data)
,但那也不管用。非常感谢,伙计们。
这是一个典型的后期绑定问题(参见common gotchas):当函数(lambda/anonymous与它无关)被调用时,它们访问[=11的当前值=],这是循环中的最后一个。尝试
lambda x=item: x.data
在你的循环中。这是有效的,因为默认参数在定义时绑定到函数,而公共局部变量在调用时计算。
类似(可能重复)的问题:Python Lambda in a loop
我在 Python 2.7。我有两个 classes 和一个 namedtuple。一个 class 包含一个字典作为实例属性和一个分配给该字典的函数。 (这是情况的一个非常简化的版本)。 namedtuple 很简单。另一个 class 是通过 add_to_test_dict
函数调用将条目添加到 test_dict
的。
然后我实例化 DictManipulator 并调用 test
函数:
from collections import namedtuple
class DictHolder(object):
def __init__(self):
self.test_dict = {}
def add_to_test_dict(self, key, val):
self.test_dict[key] = val
TestTuple = namedtuple('TestTuple', 'name data')
class DictManipulator(object):
def test(self):
named_tuple_list = [TestTuple(name='key1', data=1), TestTuple(name='key2', data=1000)]
self.my_dh = DictHolder()
for item in named_tuple_list:
self.my_dh.add_to_test_dict(item.name, lambda: item.data)
my_dm = DictManipulator()
my_dm.test()
print('key1 value: ', my_dm.my_dh.test_dict['key1']())
print('key2 value: ', my_dm.my_dh.test_dict['key2']())
# ('key1 value: ', 1000)
# ('key2 value: ', 1000)
为什么两个键 return 那里的值相同?我已经试验够了,原来的 named_tuple_list 没有更新,我也试过用 lambda: copy.deepcopy(item.data)
,但那也不管用。非常感谢,伙计们。
这是一个典型的后期绑定问题(参见common gotchas):当函数(lambda/anonymous与它无关)被调用时,它们访问[=11的当前值=],这是循环中的最后一个。尝试
lambda x=item: x.data
在你的循环中。这是有效的,因为默认参数在定义时绑定到函数,而公共局部变量在调用时计算。
类似(可能重复)的问题:Python Lambda in a loop