我有兩個對象,我想以這樣一種方式合併,即對兩個合併對象的所有引用現在指向一個合併對象。高效地合併python中的兩個對象
#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
當我使用&作爲引用操作。
那麼編寫我自己的pseudopointer對象與返回對象的解引用方法是一個有效的解決方案?
如果不是有更乾淨的方式來做到這一點(將對象1改爲合併的對象,然後將對象2的所有引用改爲對對象1的引用)?
我不明白你想完成什麼......而且我也不確定你要做什麼。 –
「我有兩個對象需要合併,這樣所有對兩個合併對象的引用現在都指向一個合併對象。」 - 不可能。你爲什麼想這樣做?有可能有更好的方法來設計你的程序。例如,您可能想要使用[union-find數據結構](https://en.wikipedia.org/wiki/Disjoint-set_data_structure)。 – user2357112
如果你有一個'[x,y,z]'的列表,並且你想合併x和y,沒有辦法將所有指向y的指針改變爲合併對象而不直接改變列表中的指針(所以mylist [i] =合併) –