按值比较lambda表达式指针

时间:2018-02-13 08:17:07

标签: python .net lambda functional-programming

考虑以下Python程序:

a = lambda x: x
b = lambda x: x
print(a == b)

这显然会输出 False ,但很清楚为什么会发生这种情况。但是,这是违反直觉的。我想知道是否有任何编程语言(不仅仅是学术性的)能够对lambda表达式进行结构比较,并在上面的例子中打印 True ?如果这没有开箱即用,是否有任何智能方法来比较lambda表达式? .NET抽象语法树怎么样?

编辑:当我得到答案时,这是一个有效的例子:

# Applies an argument arg to a function f.
apply = lambda f, arg: lambda *args, **kwargs: f(arg, *args, **kwargs)
# Compare two functions by their co_code (see answer below)
equals = lambda l0, l1: l0.__code__.co_code == l1.__code__.co_code

# Defines a function that adds 2 to a provided number.
add_two_0 = apply(add, 2)

# Another way of adding two is twice adding 1.
add_two_1 = apply(apply(add, 1), 1)

# The following statement prints True
equals(add_two_0, add_two_1)

3 个答案:

答案 0 :(得分:1)

您不需要其他编程语言。 Python 可以做到。

>>> (lambda x: x + 1).__code__ == (lambda x: x+1).__code__
True

P.S。:我没有低估你的问题。事实上,我认为你的问题是有效的。它可能是新获得了downvote能力的人。别担心;一两个声望点并不重要。

答案 1 :(得分:1)

比较代码对象不会做你想做的事情:两个不同的函数会有不同的代码对象。

您可以比较每个函数的字节码,但可以使用co_code来获取:

(lambda x:x).__code__.co_code
# b'|\x00\x00S'
(lambda y:y).__code__.co_code
# b'|\x00\x00S'


(lambda y:y+1).__code__.co_code
# b'|\x00\x00d\x01\x00\x17S'
(lambda y:y-1).__code__.co_code
# b'|\x00\x00d\x01\x00\x18S'

所以,你的比较会像预期的那样给出:

(lambda x:x).__code__.co_code == (lambda y:y).__code__.co_code
# True
(lambda y:y+1).__code__.co_code == (lambda y:y-1).__code__.co_code
# False

答案 2 :(得分:0)

这是你在找什么?

a = lambda x: x
b = lambda x: x
print(a.__code__ == b.__code__)
相关问题