Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个容器的内容标识_Python_Containers_Identity - Fatal编程技术网

Python 比较两个容器的内容标识

Python 比较两个容器的内容标识,python,containers,identity,Python,Containers,Identity,我有一个返回一组对象的方法,我正在为这个方法编写一个单元测试。是否有一种通用的、整洁的、惯用的方法来比较这些方法的同一性(而不是平等性)?或者我需要自己编写一个合适的实现吗 一个例子(为了保持简单,有些刻意): 重要的是,在这里进行相等性测试是行不通的,因为对foo\u objects\u返回的对象进行变异,使其具有\u property()可能会导致不一致的结果,这取决于这些对象在容器中的不同使用方式,即使它们在测试时是“相等的”。我能想到的最好办法是: @staticmethod def s

我有一个返回一组对象的方法,我正在为这个方法编写一个单元测试。是否有一种通用的、整洁的、惯用的方法来比较这些方法的同一性(而不是平等性)?或者我需要自己编写一个合适的实现吗

一个例子(为了保持简单,有些刻意):


重要的是,在这里进行相等性测试是行不通的,因为对
foo\u objects\u返回的对象进行变异,使其具有\u property()
可能会导致不一致的结果,这取决于这些对象在
容器中的不同使用方式,即使它们在测试时是“相等的”。

我能想到的最好办法是:

@staticmethod
def set_id(c):
    return set([id(e) for e in c])

def assertContentIdentity(self, a, b):
    self.assertEqual(set_id(a), set_id(b))

但是,这是专门针对集合的,不能处理嵌套容器。

一种简单但不是最有效的方法:

def assertContentIdentity(set1, set2):
    set1 = set([id(a) for a in set1])
    set2 = set([id(a) for a in set2])
    assert set1 == set2
从那以后,x就是y就不会在这里工作了 你能告诉我布景是 不同,我已经知道了。我 想知道他们看到的对象 包含相同的对象或对象 不同的对象

然后您需要编写自己的函数,如

set([id(x) for x in X]) == set([id(y) for y in Y])

很不清楚你在问什么。你想比较什么对象?为什么它们应该是一样的?使用
x is y
测试标识。我想知道两个容器(本例中的集合)是否相同,而不仅仅是相等
x是y
在这里不起作用,因为这会告诉我集合是不同的,我已经知道了。我想知道它们包含的对象是相同的对象还是不同的对象。为什么这些对象是相同的,只要它们相等就重要?考虑到在确定是否在容器中复制某个集合时,SET本身考虑了相等性而不是身份。还考虑到相等性的测试默认为用户定义类型的身份测试。如果在以后的例子中,我将通过<代码> FooSoObjutix返回一个对象,在我的例子中,它是一个属性< /代码>,那么如果测试产生假阳性,那么我可能会对错误的对象进行突变。在稀薄的空气中没有新的物品出现在容器中?其他测试可能已经涵盖了这一点。。。
set([id(x) for x in X]) == set([id(y) for y in Y])