我想要合并两个对象,这样两个合并对象的所有引用现在都指向一个合并对象。
#What I want
listOfObjects=[obj1, obj1, obj2, obj2, obj3]
mergeObjects(obj1, obj2)
#now
listofObjects==[merged, merged, merged, merged, obj3]
实现目标的一种方法是:
def mergeObjects(obj1, obj2):
obj1.property1+=obj2.property1
obj1.property2+=obj2.property2
obj2=obj1
然而,这有一个缺点,即没有一个合并对象,我有一个合并对象和它的相同副本。我的程序会将几十个对象相互合并,所以这会占用太多的内存。
另一种方式是:
listOfObjects=[obj1, obj1, obj2, obj2, obj3]
mergeObjects(obj1, obj2)
for i in range(len(listOfObjects)):
if (listOfObjects[i]==obj2):
listOfObjects[i]==obj1
#now
listofObjects==[merged, merged, merged, merged, obj3]
#and obj2 is now free to be garbage collected
但是,对这些对象有多个引用,并且每次合并对象时迭代它们中的每一个也不是最佳的。
我想到的一件事是我是否可以使用指针。我可以改为存储一个指向对象的指针列表,然后写:
def mergeObjects(obj1_pointer, obj2_pointer):
obj1=&obj1_pointer
obj2=&obj2_pointer
obj1.property1+=obj2.property1
obj1.property2+=obj2.property2
obj2_pointer=obj1_pointer
#let's say the pointers are themselves objects so now we have:
listOfPointers==[obj1_pointer, obj1_pointer, obj1_pointer, obj1_pointer, obj3_pointer]
#obj1_pointer is now pointing to the merged object
#obj2 now has no references so is free to be deleted
我在哪里使用&作为解引用算子。
那么使用dereference方法编写我自己的pseudopointer对象,返回一个对象是一个有效的解决方案吗?
如果没有更简洁的方法(将对象1更改为合并对象,那么对对象2的所有引用都是对对象1的引用)?
答案 0 :(得分:0)
union-find data structure是做这样事情的好方法。它将对象分组,并挑选每组的元素作为代表。它支持两种操作:
您可以使用代表跟踪合并的属性。通过排名和路径压缩实现了通常作为disjoint-set forest联合的方式,操作有效地分摊了常量时间,并且合并集合取消没有问题。 (如果您尝试使用内置的set
和set.union
执行此操作,则会导致合并设置取消合并且操作速度非常慢。)
至于实际合并所有两个对象'引用指向一个对象,没有办法做到这一点。你的指针想法有其自身的问题;即使Python支持指针,当你尝试将第一个指针与第三个指针合并时,你最终会得到以前合并的指针。