如果有人可以帮我解决这个问题(在Python中),我会很感激。我有功能
f(x) = r*x*(1-x)
并且我想重复定义它的大约26个不同的r值,范围从3.8到3.85(我想最终绘制这些函数的蜘蛛网图并比较它们,我不想将r作为我的函数的参数)。所以我想将这26个函数存储在一个列表中,然后再访问它们。我有以下代码,但它不存储不同的函数定义,而是仅存储列表中所有26个点中具有第一个值r = 3.8的函数。
r_list = []
r = 3.8
r_list.append(r)
for n in range(25):
new_r = round(r + 0.002, 3)
r_list.append(new_r)
r = new_r
f_t = []
for r in r_list:
f_t.append(lambda x: r*x*(1-x))
print r_list
print f_t
print f_t[0](3)
print f_t[2](3)
所以这些打印语句的输出是:
[3.8, 3.802, 3.804, 3.806, 3.808, 3.81, 3.812, 3.814, 3.816, 3.818, 3.82, 3.822, 3.824, 3.826, 3.828, 3.83, 3.832, 3.834, 3.836, 3.838, 3.84, 3.842, 3.844, 3.846, 3.848, 3.85]
[<function <lambda> at 0x0000000008739908>, <function <lambda> at 0x0000000008739978>, <function <lambda> at 0x00000000087399E8>, <function <lambda> at 0x0000000008739A58>, <function <lambda> at 0x0000000008739AC8>, <function <lambda> at 0x0000000008739B38>, <function <lambda> at 0x0000000008739BA8>, <function <lambda> at 0x0000000008739C18>, <function <lambda> at 0x0000000008739C88>, <function <lambda> at 0x0000000008739CF8>, <function <lambda> at 0x0000000008739D68>, <function <lambda> at 0x0000000008739DD8>, <function <lambda> at 0x0000000008739E48>, <function <lambda> at 0x0000000008739EB8>, <function <lambda> at 0x0000000008739F28>, <function <lambda> at 0x0000000008739F98>, <function <lambda> at 0x0000000008739828>, <function <lambda> at 0x000000000873D048>, <function <lambda> at 0x000000000873D0B8>, <function <lambda> at 0x000000000873D198>, <function <lambda> at 0x000000000873D208>, <function <lambda> at 0x000000000873D278>, <function <lambda> at 0x000000000873D2E8>, <function <lambda> at 0x000000000873D358>, <function <lambda> at 0x000000000873D128>, <function <lambda> at 0x00000000165452E8>]
-23.1
-23.1
我尝试了How can I define functions in a for loop?的所有建议,但我仍然无法让它发挥作用。有任何想法吗?我真的很感激。
答案 0 :(得分:1)
for r in r_list:
f_t.append(lambda x: r*x*(1-x))
Lambda没有抓住价值,他们捕捉变量。这里r
在所有lambda中都是相同的,它的值是循环中的最后一个值。
您可以通过手动捕获值来修复它:
f_t.append(lambda x,r=r: r*x*(1-x))
证明行为的小例子:
l=[1, 2, 3]
l2=[]
for r in l:
l2.append(lambda: r)
l2[0]() # 3
l2=[]
for r in l:
l2.append(lambda r=r: r)
l2[0]() # 1
答案 1 :(得分:1)
lambda函数中的r
是外部上下文的r
,因此它具有当时的值,该函数被调用。为避免这种情况,请将r
:
f_t.append(lambda x, r=r: r*x*(1-x))
答案 2 :(得分:0)
我不希望
r
作为我的功能的参数
为什么不呢?
它只存储列表中所有26个点中第一个值r = 3.8的函数。
听起来不对。它应该做的是捕获变量r
,它应该具有r
不时具有的值。
你想要做的是像这样定义你的lambda:
for r in r_list:
f_t.append(lambda x, r=r: r*x*(1-x))
这样,lambda的本地r
被赋予外部r
在定义时所具有的值。