具有Lambda值的字典更新所有条目

时间:2018-09-29 15:01:04

标签: python python-2.7 lambda namedtuple

我使用的是Python 2.7。我有两个类和一个namedtuple。一类包含一个字典作为实例属性,以及一个分配给该字典的函数。 (这是这种情况的非常简化的版本)。 namedtuple很简单。另一类是通过test_dict函数调用将条目添加到add_to_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)

为什么两个键在那里都返回相同的值?我已经进行了足够的实验,可以说原始的named_tuple_list没有更新,并且我尝试使用lambda: copy.deepcopy(item.data),但这也不起作用。谢谢大家。

1 个答案:

答案 0 :(得分:3)

这是一个典型的后期绑定问题(请参见common gotchas):调用函数(lambda / anonymous与之无关)时,它们将访问item的当前值,是循环中的最后一个。尝试

lambda x=item: x.data 

改为在您的循环中。之所以可行,是因为默认参数是在定义时绑定到函数的,而公共局部变量是在调用时求值的。

类似(可能重复)的问题:Python Lambda in a loop

相关问题