Python 按值比较lambda表达式指针

Python 按值比较lambda表达式指针,python,.net,lambda,functional-programming,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 t

考虑以下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)

您不需要另一种编程语言。Python可以做到这一点


附言:我没有否决你的问题。事实上,我认为你的问题是正确的。很可能是某个刚获得否决权的人。别担心;一两点声誉并不重要。

这就是你想要的吗

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

比较代码对象并不能满足您的需要:两个不同的函数将具有不同的代码对象

但是,您可以比较每个函数的字节码,这可以通过
co\u 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

您的语句的计算结果为True,这很有趣。然而,在我上面的例子中,我得到了我预期的结果:a.uuu code_uu==b.uu code_uu的计算结果为False。恐怕我不理解你的评论。你希望
a.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu=b.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>的计算结果为
False吗?我刚刚测试了它,a.\uu。我之所以期待这个结果,是因为Python是如何工作的。当然,我要求有一种方法使它评估为真。使用代码函数没有帮助,因为它会进行一种愚蠢的比较。例如,try(lambda x:x)。uu code_uu==(lambda y:y)。u code_uuu虽然是同一个函数,但其计算结果也为False。让我更清楚一点:a==b计算结果为False。我期待这个,但这不是我想要的。a、 _uuucode_uuu==b.uuu code_uuu的计算结果为False。我也期待这个,但这不是我想要的。(λx:x+1)。uuu代码_uuu==(λx:x+1)。uu代码_uuuu计算结果为True。我没有料到这一点,这可能是我想要的,但事实并非如此,因为只要重命名变量,它的计算结果就会像(lambda x:x)中那样为False。uuu code_uu==(lambda y:y)。uu code_u好吧,它会打印为真,但a=lambda x:xb=lambda y:y打印(a.u code_u==b.u code_u)会打印为False,这不是我想要的,因为a和b仍然相等。
(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