繁体   English   中英

使用python中的对象和列表进行内存管理

[英]memory management with objects and lists in python

我试图了解在函数中传递的赋值运算符,构造函数和参数在python中具体如何与列表和对象一起工作。 我有一个带有列表作为参数的类。 我想将其初始化为一个空列表,然后使用构造函数填充它。 我不太确定该怎么做。

可以说我的班级是-

class A:
    List = []                   # Point 1

    def __init1__(self, begin=[]): # Point 2
        for item in begin:
            self.List.append(item)

    def __init2__(self, begin):  # Point 3
        List = begin

    def __init3__(self, begin=[]): # Point 4
        List = list()
        for item in begin:
            self.List.append(item)


listObj = A()

del(listObj)

b = listObj

我有以下问题。 如果有人能澄清每种情况下发生的事情,那将是非常棒的-

  1. 声明第1点中的空白是否有效? 创造了什么? 指向NULL的变量?

  2. Point 2和Point 3中哪个是有效的构造函数? 在第3点中,我猜想不会传入(开始)的列表的新副本,而是变量List将指向指针“ begin”。 如果像第2点那样使用构造函数,是否会创建列表的新副本?

  3. 当我使用del删除对象时会发生什么? 列表也被删除了吗?还是必须在包含对象上调用del之前先在列表上调用del? 我知道Python使用GC,但是如果我担心在GC启动之前就清理未使用的内存,是否值得?

  4. 同样将类型A的对象分配给另一个对象只会使第二个对象指向第一个右边吗? 如果是这样,我该如何进行深拷贝? 有重载运算符的功能吗? 我知道python可能比这个简单得多,因此是个问题。

编辑:5.我只是意识到使用Point 2和Point 3并没有什么不同。 列表开头的项目仅通过引用进行复制,不会进行新的复制。 为此,我必须使用list()创建一个新列表。 我猜想起来,这很有意义。

谢谢!

为了:

  1. 使用这种形式只是调用列表构造函数的语法糖-即,您正在创建一个新的(空)列表。 这将绑定到类本身(是一个静态字段),并且对于所有实例都是相同的。
  2. 除了必须始终为init的构造函数名称之外,两者均为有效形式,但含义不同。
    • 可以使用列表作为参数或不使用列表来调用第一个构造函数。 如果调用时不带参数,则使用默认传递的空列表(该空列表在类定义期间创建一次,而不是在每次构造函数调用时创建一次),因此不会将任何项目添加到静态列表中。
    • 第二个必须使用list参数调用,否则python会报错,但在没有self的情况下使用它 像您这样做的前缀一样,它只会创建一个新的局部变量名称List ,只能在构造函数中访问,而将静态A.List变量保留不变。
  3. 删除只会取消对对象的引用,而不会真正删除任何内容。 但是,一旦除去所有引用,垃圾收集器就可以根据需要自由清除内存。 尝试控制垃圾收集器通常是一个坏主意。 代替。 只要确保您不再持有对不再需要的对象的引用,并使其起作用即可。
  4. 为对象分配变量只会创建对同一对象的新引用。 要创建深层副本,请使用相关功能或编写自己的功能
  5. 可以通过在类定义中覆盖一些特殊的方法来实现运算符重载(谨慎使用,可能会使事情更加混乱,而不是被误用)。

关于您的编辑:就像我上面指出的那样,在构造函数内部编写List = list()时 ,不使用self。 (或者更好,因为变量是静态的A. )前缀,您只是在创建一个空变量, 而不覆盖您在类主体中定义的变量。

作为参考,将列表作为默认参数处理的通常方法是使用None占位符:

class A(object):
   def __init__(self, arg=None):
      self.startvalue = list(arg) if arg is not None else list()
      # making a defensive copy of arg to keep the original intact

顺便说一句,请看一下python教程。 写得很好,易于理解和理解。

“如果有人能澄清每种情况下发生的事情,那将非常棒”,这不是dis模块的目的吗? http://docs.python.org/2/library/dis.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM