处理Python程序中的大量对象

时间:2016-07-04 04:04:18

标签: python python-3.x oop

我正在构建一个python程序,它将使用数千个python对象。我很好奇组织它们的最优雅方式是什么,我也不清楚什么时候在python中复制。

例如,如果我有一个拥有数千个对象列表的管理器对象,但它也有一个字典,其中包含数千个对象中的每一个的键,那么这些对象在内存中是否存在两次?如果我要更改列表中对象的属性,它是否也会更改dict中相应对象的属性?

我无法在此找到很好的阅读,所以如果有人能指出我正确的方向,那将会有所帮助。

以下是我的想法:

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"

第一个管理器中该对象的名称是否更改? dict键仍然是旧名称吗?

最后,成千上万个对象的列表或字典确实是组织大量python对象的最佳方式,还是有更好的方式我还没遇到过?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

This post讨论了通过引用传递变量(Python通过赋值传递)。

  

[If]我有一个管理器对象,它有一个包含数千个对象的列表,但它也有一个字典,其中包含数千个对象中的每个对象,这些对象在内存中是否存在两次?如果我要更改列表中对象的属性,它是否也会更改dict中相应对象的属性?

当您通常在字典中使用对象名称作为键或值时,您将传递对该对象的引用。如果要更新对象中的某个值,则还将更新字典(或列表)中的值。

>>> 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对象的是什么?你需要遍历它们吗?您是否尝试根据某些条件过滤对象?你需要快速检查是否存在某些价值?是否有必要在内存中保留数千个对象?

如果没有更多信息,这部分问题就不容易回答。