Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有Lambda值的字典将更新所有条目_Python_Python 2.7_Lambda_Namedtuple - Fatal编程技术网

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

Python 具有Lambda值的字典将更新所有条目,python,python-2.7,lambda,namedtuple,Python,Python 2.7,Lambda,Namedtuple,我使用的是Python 2.7。我有两个类和一个名为tuple的类。一个类包含一个字典作为实例属性和一个分配给该字典的函数。(这是一个非常简化的情况)。namedtuple非常简单。另一个类是通过add_to_test_dict函数调用将条目添加到test_dict 然后我实例化DictManipulator并调用test函数: from collections import namedtuple class DictHolder(object): def __init__(self

我使用的是Python 2.7。我有两个类和一个名为tuple的类。一个类包含一个字典作为实例属性和一个分配给该字典的函数。(这是一个非常简化的情况)。namedtuple非常简单。另一个类是通过
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)

为什么两个键都返回相同的值?我已经做了足够多的实验,可以说原始的命名元组列表没有更新,我尝试使用
lambda:copy.deepcopy(item.data)
,但这也不起作用。非常感谢,各位。

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

lambda x=item: x.data 
而是在你的循环中。这是因为默认参数在定义时绑定到函数,而公共局部变量在调用时求值


类似(可能重复)问题:

典型的后期绑定问题。在你的循环中尝试
lambda x=item:x.data
。你这个漂亮的人!谢谢你的帮助。现在一切正常,我很感谢你的澄清。这对我来说是一个盲点。@semi.suite是的,这是Python中的一个常见问题:)我链接了这个主题的“搭便车者”部分。