python中lambda函数的模糊性

2024-04-18 23:56:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个模型“走”过一个网格。你知道吗

enter image description here

所以我创建了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]))

但当我尝试应用任何函数时,我得到None

print g0([(50,50)])
None

好吧,让我们试试更传统的方法:

def g0(ct):
    ct.append((lambda (x,y): (x-1,y))(ct[-1]))
    return ct

正如预期的那样:

[(50, 50), (49, 50)]

但当我尝试

def g0(ct):          
    return ct.append((lambda (x,y): (x-1,y))(ct[-1]))

结果也是None,为什么?你知道吗


Tags: lambda函数模型none网格returndefct
3条回答

list.append()就地更改列表,与所有直接操作底层可变对象的Python标准库方法一样,该方法返回None来表示这一点。你知道吗

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

  • 不要更改原始列表,而是返回新列表:

    g0 = lambda ct: ct + [(lambda (x,y): (x-1,y))(ct[-1])]
    
  • 附加到原始列表并用or链接原始列表对象以返回它而不是None

    g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1])) or ct
    

演示:

>>> 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)]

第一个版本使原始列表不受影响;返回一个新的list对象。第二种方法更改了原始列表;返回值和ct都引用同一个对象。你知道吗

lambda函数将元素附加到列表中,但不返回任何内容(None):

g0 = lambda ct: ct.append((lambda (x,y): (x-1,y))(ct[-1]))

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

在第二个示例中,您实际返回的是列表,因此它的工作方式与您预期的一样:

def g0(ct):
   ct.append((lambda (x,y): (x-1,y))(ct[-1]))
   return ct

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

您还询问是否可以重写lambda函数以返回列表。。。好吧,是的,但是如果有人问你这件事,不要提我的名字:

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

代码不容易阅读,我建议您改用函数。你知道吗

另外,这个问题与您的问题相关:why the list.append return None?

当您将一个元素附加到一个列表中时,您将返回None作为默认值,这将导致表达式返回None。你知道吗

在第二个示例中,将lambda函数附加到列表中,然后返回列表。这就是为什么它能像你期望的那样工作。你知道吗

相关问题 更多 >