可能重复:
使用lambda表达式中的变量值
我正在使用python并尝试隔离我使用lambda函数的问题.
从下面的代码我期望创建两个lambda函数,每个函数得到一个不同的x,输出应该是
1 2
但输出是2 2
为什么?我怎样才能创造两种不同的功能?使用def?
def main():
d = {}
for x in [1,2]:
d[x] = lambda : print(x)
d[1]()
d[2]()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) 为什么这段代码打印"d,d,d,d",而不是"a,b,c,d"?如何修改它以打印"a,b,c,d"?
cons = []
for i in ['a', 'b', 'c', 'd']:
cons.append(lambda: i)
print ', '.join([fn() for fn in cons])
Run Code Online (Sandbox Code Playgroud) 将lambda函数存储到字典中时,我遇到了一些奇怪的行为:如果尝试将某个默认值传递给循环中的函数,则只使用最后一个默认值.
这是一些最小的例子:
#!/usr/bin/env python
# coding: utf-8
def myfct(one_value, another_value):
"do something with two int values"
return one_value + another_value
fct_dict = {'add_{}'.format(number): (lambda x: myfct(x, number))
for number in range(10)}
print('add_3(1): {}, id={}'.format(fct_dict['add_3'](1), id(fct_dict['add_3'])))
print('add_5(1): {}, id={}'.format(fct_dict['add_5'](1), id(fct_dict['add_5'])))
print('add_9(1): {}, id={}'.format(fct_dict['add_9'](1), id(fct_dict['add_9'])))
Run Code Online (Sandbox Code Playgroud)
输出如下
add_3(1): 10, id=140421083875280
add_5(1): 10, id=140421083875520
add_9(1): 10, id=140421083876000
Run Code Online (Sandbox Code Playgroud)
你得到不同的函数(id不相同),但每个函数使用相同的第二个参数.
有人能解释一下发生了什么吗?
python2,python3,pypy也是如此......
我在 Python 2.7 中。我有两个类和一个命名元组。一个类包含一个字典作为实例属性和一个分配给该字典的函数。(这是情况的一个非常简化的版本)。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)
Run Code Online (Sandbox Code Playgroud)
为什么两个键在那里返回相同的值?我已经进行了足够的实验,可以说原始的 …