当前位置: 首页 > 面试题库 >

检查两个Python函数是否相等

丁淇
2023-03-14
问题内容

我想知道如何检查两个功能是否相同。一个示例将(lambda x: x) == (lambda y: y)评估为true。据我所知,Python将检查函数是否在内存中占据相同的位置,而不是它们是否具有相同的操作。我知道拥有该功能似乎不切实际。

另一个解决方案是我可以在函数上运行以查看其包含的内容或工作方式的某些方法。因此,其中一种(lambda x: x).what()将返回该方法的工作方式,可能是在字典中还是在某种形式中。

我希望得到一个答案,但我怀疑这是可能的。


问题答案:

如果您真的想知道两个函数是否总是对所有输入执行相同的操作,则必须在所有输入上同时运行它们(这将花费无限的时间),并且还必须拦截所有可能的副作用(实际上是不可能的)。

您当然可以想到一些启发式方法,向它们抛出一组不同的值,如果您使用的功能不同,则对于您的应用程序领域,它们很可能会产生不同的输出。但是显然没有通用的解决方案-
否则,所有单元测试都将自动生成,从而为我们节省了很多工作,对吗?

相反,您可能只想知道两个函数是否具有完全相同的实现。为此,Martijn
Pieters的答案是显而易见的起点,甚至可能是终点(取决于您是否关心闭包,全局变量等)。

但是您要的是与这两个都不相同的东西。您显然想手动查看代码以查看“它是如何工作的”:

另一个解决方案是我可以在函数上运行以查看其包含的内容或工作方式的某些方法。因此,一种(lambda
x:x).what()可以返回方法的工作方式,可能是在字典中还是在其他地方。

该功能已经存在:dis.dis。在函数上运行它时,它会告诉您该函数的工作方式。不是在字典中(什么是字典?),而是在Python解释器的字节代码序列中(这是一个相对简单的堆栈机,上面添加了一些更高层次的内容,大部分在dis文档中进行了描述)。

或者,甚至更简单地,您可以使用获取源inspect.getsource

这是您的示例的两个样子:

>>> f1 = lambda x: x
>>> f2 = lambda y: y
>>> def f3(z):
...     return z
>>> dis.dis(f1)
  1           0 LOAD_FAST                0 (x)
              3 RETURN_VALUE
>>> dis.dis(f2)
  1           0 LOAD_FAST                0 (y)
              3 RETURN_VALUE
>>> dis.dis(f3)
  1           0 LOAD_FAST                0 (z)
              3 RETURN_VALUE
>>> inspect.getsource(f1)
'f1 = lambda x: x\n'
>>> inspect.getsource(f2)
'f2 = lambda y: y\n'
>>> inspect.getsource(f3)
'def f3(z):\n    return z\n'

在第一种情况下,您需要了解足够的知识,dis以了解(x)等等不是字节码的一部分,而是函数的本地名称列表的一部分。(在inspect文档中以及在dis文档中对此进行了解释。)在第二篇中,您需要对Python有足够的了解,以认识到deflambda定义了完全相同的功能。因此,无论哪种方式,都无法
实现 这一目的的 html" target="_blank">自动化 (或者,实际上,Martijn不能解决的任何事情)。



 类似资料:
  • 问题内容: 我想检查两个数组是否相等。我的意思是:相同的大小,相同的索引,相同的值。我怎样才能做到这一点? 根据用户的建议,如果数组中的至少一个元素不同,我希望以下内容可以打印 enter ,但实际上没有。 问题答案: $arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs. $arraysA

  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。

  • 嗨,我正在尝试解决Udemy练习:编写一个名为hasSharedDigit的方法,其中包含int类型的两个参数。 每个数字应在10(含)-99(含)之间。如果其中一个数字不在范围内,则该方法应返回false。 如果两个数字中都有数字,例如12和23中的2,则该方法应返回true;否则,该方法应返回false。 我一直在得到真实,而有共享数字(9,99)我无法发现为什么.. }

  • 问题内容: 我收到了2个轮廓(和)。我怎么知道它们是否相交?我不需要坐标,我只需要一个布尔值或。 我尝试了不同的方式,并且已经尝试与 …但是得到的错误是数组没有方法“ Area()” 问题答案: 一旦有了的两个轮廓,就可以使用按位运算来检测相交。具体来说,我们可以使用。想法是为每个轮廓创建两个单独的图像,然后对它们使用逻辑运算。具有正值(或)的任何点都将是交点。因此,由于您只想获取是否存在相交的布

  • 假设我有一组数组,包括和,我想检查它们是否相等。一般来说,我可以只使用(除了一些我现在忽略的愚蠢的情况)。 但是,这会计算的整个数组,这通常是不需要的。我的数组非常大,而且我有很多数组,两个数组相等的概率很小,所以很可能,在函数返回False之前,我只需要计算的一小部分,所以这对我来说不是一个最佳解决方案。 我尝试使用内置的函数,并结合: 然而,在两个数组相等的情况下,这似乎要慢得多,总的来说,它

  • 我有一个String类型的数组列表和一个Person类型的数组列表。其中,Person是一个仅包含包含名称的字符串的对象。 假设我这样做, 假设创建一个新的Person对象会将名称设置为“Josh”,并假设Person类具有该名称的get方法。 有没有办法检查名称数组列表中是否包含名为Josh的人。 我唯一能想到的就是这个, 现在,如果Person数组列表和names数组列表包含多个元素,如何检查