python中"lambda"函数的不安全性

Ser*_*nin 1 python lambda list

我想制作一个"走路"的模型.

在此输入图像描述

所以我创建了8个函数:

g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1]))
g1 = lambda ct: ct.append((lambda (x,y): (x-1,y+1))(ct[-1]))
g2 = lambda ct: ct.append((lambda (x,y): (x,y+1))(ct[-1]))
g3 = lambda ct: ct.append((lambda (x,y): (x+1,y+1))(ct[-1]))
g4 = lambda ct: ct.append((lambda (x,y): (x+1,y))(ct[-1]))
g5 = lambda ct: ct.append((lambda (x,y): (x+1,y-1))(ct[-1]))
g6 = lambda ct: ct.append((lambda (x,y): (x,y-1))(ct[-1]))
g7 = lambda ct: ct.append((lambda (x,y): (x-1,y-1))(ct[-1]))
Run Code Online (Sandbox Code Playgroud)

但当我尝试应用任何功能时,我得到None:

print g0([(50,50)])
None
Run Code Online (Sandbox Code Playgroud)

好吧,Iet尝试更传统的方式:

def g0(ct):
    ct.append((lambda (x,y): (x-1,y))(ct[-1]))
    return ct
Run Code Online (Sandbox Code Playgroud)

这是按预期工作的:

[(50, 50), (49, 50)]
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试

def g0(ct):          
    return ct.append((lambda (x,y): (x-1,y))(ct[-1]))
Run Code Online (Sandbox Code Playgroud)

结果也是None,为什么?

Max*_*amy 7

你的lambda函数将一个元素附加到一个列表,它不返回任何内容(None):

g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1]))
Run Code Online (Sandbox Code Playgroud)

更确切地说,它不返回任何内容,因为它ct.append(...)是一个返回的方法,None而你的lambda返回返回的内容ct.append(...).

在第二个示例中,您实际上是返回列表,因此它可以按预期工作:

def g0(ct):
   ct.append((lambda (x,y): (x-1,y))(ct[-1]))
   return ct
Run Code Online (Sandbox Code Playgroud)

但是,要小心,因为即使您不返回列表,您的列表实际上也会被更改.

你也在问是否可以重写lambda函数来返回列表...嗯,是的,但如果有人问你这个问题,请不要提我的名字:

>>> g0 = lambda ct: (ct.append((lambda (x,y): (x-1,y))(ct[-1])) or ct)
>>> print g0([(50,50)])
[(50, 50), (49, 50)]
Run Code Online (Sandbox Code Playgroud)

代码不容易阅读,我建议你改用函数.

此外,这个问题与您的问题有关:为什么list.append返回None?


Mar*_*ers 7

list.append()就地修改列表,就像直接在底层可变对象上运行的所有Python标准库方法一样,该方法返回None发出信号.

您的lambda返回不是列表对象,而是结果ct.append(); 例如None.您有两种选择:

演示:

>>> ct = [(50,50)]
>>> g0 = lambda ct: ct + [(lambda (x,y): (x-1,y))(ct[-1])]
>>> g0(ct)
[(50, 50), (49, 50)]
>>> ct
[(50, 50)]
>>> g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1])) or ct
>>> g0(ct)
[(50, 50), (49, 50)]
>>> ct
[(50, 50), (49, 50)]
Run Code Online (Sandbox Code Playgroud)

第一个版本使原始列表不受影响; 返回一个新的列表对象.第二种方法改变了原始列表; 返回值并且ct都指向同一个对象.