我想做一个模型“走”过一个网格。你知道吗
所以我创建了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
,为什么?你知道吗
list.append()
就地更改列表,与所有直接操作底层可变对象的Python标准库方法一样,该方法返回None
来表示这一点。你知道吗您的
lambda
返回的不是list对象,而是ct.append()
的结果;例如None
。您有两种选择:不要更改原始列表,而是返回新列表:
附加到原始列表并用
or
链接原始列表对象以返回它而不是None
:演示:
第一个版本使原始列表不受影响;返回一个新的list对象。第二种方法更改了原始列表;返回值和
ct
都引用同一个对象。你知道吗lambda函数将元素附加到列表中,但不返回任何内容(
None
):更准确地说,它不返回任何内容,因为
ct.append(...)
是一个返回None
的方法,而lambda返回ct.append(...)
返回的内容。你知道吗在第二个示例中,您实际返回的是列表,因此它的工作方式与您预期的一样:
但是,要小心,因为即使您不返回列表,您的列表实际上也会被更改。你知道吗
您还询问是否可以重写lambda函数以返回列表。。。好吧,是的,但是如果有人问你这件事,不要提我的名字:
代码不容易阅读,我建议您改用函数。你知道吗
另外,这个问题与您的问题相关:why the list.append return None?
当您将一个元素附加到一个列表中时,您将返回
None
作为默认值,这将导致表达式返回None
。你知道吗在第二个示例中,将
lambda
函数附加到列表中,然后返回列表。这就是为什么它能像你期望的那样工作。你知道吗相关问题 更多 >
编程相关推荐