[英]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点中的空白是否有效? 创造了什么? 指向NULL的变量?
Point 2和Point 3中哪个是有效的构造函数? 在第3点中,我猜想不会传入(开始)的列表的新副本,而是变量List将指向指针“ begin”。 如果像第2点那样使用构造函数,是否会创建列表的新副本?
当我使用del删除对象时会发生什么? 列表也被删除了吗?还是必须在包含对象上调用del之前先在列表上调用del? 我知道Python使用GC,但是如果我担心在GC启动之前就清理未使用的内存,是否值得?
同样将类型A的对象分配给另一个对象只会使第二个对象指向第一个右边吗? 如果是这样,我该如何进行深拷贝? 有重载运算符的功能吗? 我知道python可能比这个简单得多,因此是个问题。
编辑:5.我只是意识到使用Point 2和Point 3并没有什么不同。 列表开头的项目仅通过引用进行复制,不会进行新的复制。 为此,我必须使用list()创建一个新列表。 我猜想起来,这很有意义。
谢谢!
为了:
关于您的编辑:就像我上面指出的那样,在构造函数内部编写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.