0

我正在阅读有关 lambdas(潜入 python)的内容,并且我执行了一个示例代码,得到的结果与文本状态不同。它是example 4.21

processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

这是我的 py 2.7 控制台输出:

>>> collapse = True
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc("this   is\na\ttest")
'this is a test'

如我所见,无论collapse值是多少,都会返回第一个 lambda 表达式。是我的想法有问题还是 python 版本改变了,或者为什么我得到的结果与这本传说中的书不同?

4

1 回答 1

6

您需要重新processFunc 设置

每次设置时都不会重新评估表达式collapse;它只计算一次。执行collapse = False并没有神奇地改变processFunc为指向另一个 lambda。

只需processFunc =再次运行表达式:

>>> collapse = True
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this   is\na\ttest'

如果您希望processFunc被重新评估,您需要自己将其设为函数或 lambda:

>>> collapse = True
>>> processFunc = lambda: collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc()("this is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc()("this is\na\ttest")
'this is\na\ttest'

但请注意,您现在必须调用 processFunc()以返回您的 lambda 对象,然后我们使用参数调用该对象。通过调用processFunc重新计算表达式,collapse在周围范围内查找名称(在本例中为全局),并返回其中一个 lambda。

于 2013-07-01T21:05:01.370 回答