2016-07-04 37 views
2

我正在構建一個python程序,它將與數千個python對象一起工作。我很好奇什麼是最優雅的方式來組織它們,而且我也不清楚什麼時候將事情複製到python中。處理Python程序中的很多對象

例如,如果我有一個擁有數千個對象列表的管理器對象,但它也有一個包含這些數千個對象中每一個對象的鍵的字典,那麼這些對象是否在內存中存在兩次?如果我要更改列表中某個對象的屬性,它是否也會更改字典中相應對象的屬性?

我無法在這方面找到太多的好消息,所以如果有人能指引我朝着正確的方向發展,那將會有所幫助。

這裏是我的想法:

class Manager(): 
    def __init__(self,list_of_objects): 
     self.myobjects = [] 
     self.myobjectsdict= {} 

     self.myobjects = list_of_objects 

     for object in self.myobjects: 
      self.myobjectsdict[object.name] = object 

然後,如果我要創建第二個管理器對象,並給它一些第一經理人的對象,他們會是副本?或者,第二位經理所做的更改是否適用於第一位所欠對象?例如,這裏發生了什麼:

manager2 = Manager(manager1.myobjects[5000:10000]) 
manager2.myobjects[71].name = "newname" 

第一個管理器中該對象的名稱是否更改?字典密鑰仍然是舊名稱?

最後,是成千上萬個對象的列表還是字典真的是組織大量python對象的最佳方式,還是有沒有更好的方式我沒有遇到過?非常感謝您的幫助。

+0

聽起來就像接近需要數據庫,ORM和類。 –

回答

0

This post談論通過引用傳遞變量(Python通過賦值)。

[如果]我有一個管理對象,它有一個數以千計的對象列表,但它也有一個字典,其中包含上千個對象中的每一個對象,這些對象是否在內存中存在兩次?如果我要更改列表中某個對象的屬性,它是否也會更改字典中相應對象的屬性?

當您通常使用對象名稱作爲字典中的鍵或值時,您正在傳遞對該對象的引用。如果您要更新對象中的某個值,則字典(或列表)中的值也會更新。

>>> my_object = MyClass() # Myclass is instantiated with x = 10 
>>> my_dict = {"my_obj":my_object} 
>>> my_dict["my_obj"] is my_object 
True 
>>> my_dict["my_obj"].x 
10 

如果你把這個字典放在一個對象裏面,它的行爲方式是一樣的。

然後,如果我要創建第二個管理器對象並給它一些第一個管理器對象,它們是否是副本?

不,他們也是參考。如果您更改任一經理的姓名,那麼其他經理也會受到影響。

最後,是成千上萬個對象的列表或字典真的是組織大量python對象的最佳方式,還是有沒有更好的方法我沒有遇到?

你在用什麼Python對象?你需要遍歷它們嗎?你是否試圖根據一些標準過濾對象?你是否需要快速檢查是否存在某種價值?是否有必要在內存中保存數千個對象?

沒有更多的信息,這部分的問題不能輕易回答。

+0

謝謝,你鏈接的那篇文章正是我正在尋找的。 – csc