swap = lambda a,x,y:(lambda f=a.__setitem__:(f(x,(a[x],a[y])),
f(y,a[x][0]),f(x,a[x][1])))()
看到最后的 () 了吗?内部 lambda 不返回,它被调用。
该函数相当于
def swap(a, x, y):
a[x] = (a[x], a[y])
a[y] = a[x][0]
a[x] = a[x][1]
但是让我们假设我们想在 lambda 中执行此操作。我们不能在 lambda 中使用赋值。但是,我们可以要求__setitem__
同样的效果。
def swap(a, x, y):
a.__setitem__(x, (a[x], a[y]))
a.__setitem__(y, a[x][0])
a.__setitem__(x, a[x][1])
但是对于 lambda,我们只能有一个表达式。但是由于这些是函数调用,我们可以将它们包装在一个元组中
def swap(a, x, y):
(a.__setitem__(x, (a[x], a[y])),
a.__setitem__(y, a[x][0]),
a.__setitem__(x, a[x][1]))
然而,所有这些__setitem__
都让我失望,所以让我们把它们排除在外:
def swap(a, x, y):
f = a.__setitem__
(f(x, (a[x], a[y])),
f(y, a[x][0]),
f(x, a[x][1]))
Dagnamit,我无法逃脱添加另一个任务!我知道让我们滥用默认参数。
def swap(a, x, y):
def inner(f = a.__setitem__):
(f(x, (a[x], a[y])),
f(y, a[x][0]),
f(x, a[x][1]))
inner()
好的,让我们切换到 lambda:
swap = lambda a, x, y: lambda f = a.__setitem__: (f(x, (a[x], a[y])), f(y, a[x][0]), f(x, a[x][1]))()
这让我们回到了原来的表达方式(加/减错别字)
所有这些都回到了一个问题:为什么?
该功能应该已实现为
def swap(a, x, y):
a[x],a[y] = a[y],a[x]
原作者竭尽全力使用 lambda 而不是函数。可能是出于某种原因他不喜欢嵌套函数。我不知道。我要说的是它的错误代码。(除非有一个神秘的理由。)