如果我已经调用了一个类的对象,我可以将它赋给一个变量吗?Python 3

如果我已经调用了一个类的对象,我可以将它赋给一个变量吗?Python 3,python,python-3.x,class,reference,Python,Python 3.x,Class,Reference,使用myClass()创建类型为myClass的对象。在这样调用变量之后,如何将该对象精确地分配给变量?因为如果我在调用myClass()之后添加a=myClass(),将创建另一个对象,并且a将指向该另一个对象。由于CPython垃圾收集,这样做是不可能的: class myClass: pass myClass() 但是没有用例,并且是100%不可能的(至少在CPython中是这样),因为对象在创建之后立即被销毁,因为没有变量指向它(没有变量引用该类) 弱引用是不阻止删除对象的

使用
myClass()
创建类型为
myClass
的对象。在这样调用变量之后,如何将该对象精确地分配给变量?因为如果我在调用myClass()之后添加
a=myClass()
,将创建另一个对象,并且
a
将指向该另一个对象。

由于CPython垃圾收集,这样做是不可能的:

class myClass:
    pass

myClass()
但是没有用例,并且是100%不可能的(至少在CPython中是这样),因为对象在创建之后立即被销毁,因为没有变量指向它(没有变量引用该类)


弱引用是不阻止删除对象的引用。这样,我们可以看到一个对象被删除,如下所示:

myClass()
a = lastObjectCreated()

这证明它真的消失了。

如果只调用类构造函数,而不将结果赋给变量,则不会创建引用。甚至垃圾收集器都不知道此类的实例

class myClass:
    pass

import weakref

def catch_deletion(object):
    print('Object was deleted')

weakref.ref(myClass(), catch_deletion)
#Output: Object was deleted
输出:

import gc

class myClass:
    pass

myClass() 
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )

a = myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
del a

gc.disable() # even disabling the garbage collector will not make a difference
myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
import gc

class myClass:
    ref = []
    def __init__(self):
        myClass.ref.append(self)

myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )

a = myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
del a

gc.collect() # force garbage collection
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
输出:

import gc

class myClass:
    pass

myClass() 
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )

a = myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
del a

gc.disable() # even disabling the garbage collector will not make a difference
myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
import gc

class myClass:
    ref = []
    def __init__(self):
        myClass.ref.append(self)

myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )

a = myClass()
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
del a

gc.collect() # force garbage collection
print( [o for o,t in globals().items() if isinstance(t, myClass)], [o for o in gc.get_objects() if isinstance(o, myClass)] )
[]
['a'][,]
[] [, ]
注意:这样,垃圾收集器将永远不会删除此类的实例,即使删除了变量,只要类保留对实例的引用

[] [<__main__.myClass object at 0x00000000048226D8>]
['a'] [<__main__.myClass object at 0x00000000048226D8>, <__main__.myClass object at 0x0000000004890860>]
[] [<__main__.myClass object at 0x0000000004890860>, <__main__.myClass object at 0x00000000048226D8>]

当使用
b=a
时,这意味着
b
将指向与
a
相同的内存位置,因为类是可变的。通过将实例存储为基类中的列表,您可以手动存储实例以供以后参考。

a=myClass();b=a
?我刚刚回答了这个问题。为什么不试试看会发生什么呢?如果只调用
myClass()
,而不将结果对象分配给变量,那么对该对象的引用将丢失,并将被垃圾收集。这就像调用任何其他函数而不存储结果一样。我想你不明白我的意思。我想知道这样的事情是否可能:`myClass();a=lastObjectCreatedInTheMemory()。当然,这个函数不存在,但我希望我能理解。如果您使用的是交互式解释器,
\uu
将是对上一个计算表达式的vaue的引用,前提是它没有被赋予另一个值。看:我知道,但我问的是别的。如果您像这样使用
myClass()
,而不将其分配给变量,您可以将该确切对象分配给变量吗?对该对象的引用是否永远丢失?引用不是丢失,而是删除。不可能把它取回。这与垃圾收集器无关。该对象可能仍存在于内存中,但其引用未知。@EthanK最终。创建对象后,它可能会也可能不会立即执行此操作。无论如何,Python中的GC实现是一个实现细节。@DeepSpace如果我写
myClass();print(locals())
我只能看到类定义,没有类的实例,即使使用
gc.disable()